是否可以获取glsl mat4单个列的位置?我想更新着色器中定义的矩阵的单个列的值,而无需实际设置整个矩阵的统一性。
我有一个游戏,相机的方位经常保持不变,但平移部分却经常变化。我的想法是只更新VP矩阵的受影响翻译部分(投影*视图),以压缩某些性能。
答案 0 :(得分:3)
是否可以获取glsl mat4单个列的位置?
否。
对于mat
统一变量类型,您需要使用适当的glUnfiformMatrix...()
调用,并且不能更新其中的各个部分:
可能的选择:
uniform vec4 mymat[4]
代替mat4
,并在着色器中构造矩阵(如果需要),或者直接使用各个列向量进行计算。 答案 1 :(得分:3)
您不能。您不能再设置矩阵统一的一列,而不能设置uint
统一的高两个字节,而无需同时设置其他两个字节。对于制服,矩阵与向量或标量一样,都是基本类型。
我的想法是只更新视图矩阵的转换部分,以降低性能。
这不会那样做。执行非常小的CPU到GPU的内存传输的性能将由执行任何的CPU到GPU的传输开销决定。即,传输16个字节的成本将与传输64个字节的成本基本相同。当传输的数据量开始变大(千字节/兆字节)时,传输的数据量才变得对传输成本产生重大影响。
所以这是浪费时间。只需转移矩阵并继续。过早的优化是万恶之源。
答案 2 :(得分:0)
不,你不能。通常,您不需要这样做,因为现代硬件如此快地执行了这种从cpu到gpu的传输,因此发送列或整个矩阵之间没有明显的区别。但就我而言(在使用opengl es的嵌入式系统中),我遇到了类似情况的瓶颈。所以我改变制服的属性。矩阵的每一行都将成为vec4属性,我们使用VBO发送数据。频繁的数据更改将由buffer streaming完成。我并不是说这是一个好方法,并且可以提高性能(硬件有所不同),但就我而言,它可以正常工作。