我可以使用glUniform4fv设置着色器矩阵的单个列吗?

时间:2019-06-10 14:30:24

标签: opengl glsl

是否可以获取glsl mat4单个列的位置?我想更新着色器中定义的矩阵的单个列的值,而无需实际设置整个矩阵的统一性。

我有一个游戏,相机的方位经常保持不变,但平移部分却经常变化。我的想法是只更新VP矩阵的受影响翻译部分(投影*视图),以压缩某些性能。

3 个答案:

答案 0 :(得分:3)

  

是否可以获取glsl mat4单个列的位置?

否。

对于mat统一变量类型,您需要使用适当的glUnfiformMatrix...()调用,并且不能更新其中的各个部分:

可能的选择:

  • 使用Uniform Buffer Object,您可以在其中单独控制每个字节,如@ Rabbid76的注释所建议的那样。
  • 使用uniform vec4 mymat[4]代替mat4,并在着色器中构造矩阵(如果需要),或者直接使用各个列向量进行计算。

答案 1 :(得分:3)

您不能。您不能再设置矩阵统一的一列,而不能设置uint统一的高两个字节,而无需同时设置其他两个字节。对于制服,矩阵与向量或标量一样,都是基本类型。

  

我的想法是只更新视图矩阵的转换部分,以降低性能。

这不会那样做。执行非常小的CPU到GPU的内存传输的性能将由执行任何的CPU到GPU的传输开销决定。即,传输16个字节的成本将与传输64个字节的成本基本相同。当传输的数据量开始变大(千字节/兆字节)时,传输的数据量才变得对传输成本产生重大影响。

所以这是浪费时间。只需转移矩阵并继续。过早的优化是万恶之源。

答案 2 :(得分:0)

不,你不能。通常,您不需要这样做,因为现代硬件如此快地执行了这种从cpu到gpu的传输,因此发送列或整个矩阵之间没有明显的区别。但就我而言(在使用opengl es的嵌入式系统中),我遇到了类似情况的瓶颈。所以我改变制服的属性。矩阵的每一行都将成为vec4属性,我们使用VBO发送数据。频繁的数据更改将由buffer streaming完成。我并不是说这是一个好方法,并且可以提高性能(硬件有所不同),但就我而言,它可以正常工作。