例如,如果我使用顶点着色器,如下所示:
#version 400 core
uniform mat4 projM;
uniform mat4 viewM;
uniform mat4 modelM;
in vec4 in_Position;
out vec4 pass_position_model;
void main(void) {
gl_Position = projM * viewM * modelM * in_Position;
pass_position_model = modelM * in_Position;
}它是否会对每个顶点进行projM * viewM * modelM矩阵乘法,或者它是否足够智能地计算一次,并且直到统一变量改变后才重新计算?如果它不够“智能”,那么除了在CPU上计算所有统一依赖的值并将它们作为统一变量发送到GPU之外,还有什么方法可以优化它吗?
另外,我对以后可以毫无问题地移植到OpenGL ES 2.0的解决方案很感兴趣。
发布于 2013-03-18 19:19:45
因此,据我所知,没有一般的答案。我在我的硬件上做了一些测试。我的清单中有两个GPU:Intel HD Graphics 3000和NVidia GeForce GT 555M。我用顶点着色器中的矩阵乘法测试了我的程序(程序本身是用java/scala编写的),然后将乘法转移到CPU程序并再次测试。
(sphereN -它是一个连续旋转的球体,有2*N^2个四边形,使用glDrawElements(GL_QUADS,...)绘制)具有1个纹理且没有任何照明/其他效果)
顶点着色器中的矩阵乘法:
intel:
sphere400: 57.17552887364208 fps
sphere40: 128.1394156842645 fps
nvidia:
sphere400: 134.9527665317139 fps
sphere40: 242.0135527589545 fps处理器上的矩阵乘法
intel:
sphere400: 57.37234652897303 fps
sphere40: 128.2051282051282 fps
nvidia:
sphere400: 142.28799089356858 fps
sphere40: 247.1576866040534 fps测试表明,在顶点着色器中乘以(均匀)矩阵不是一个好主意,至少在这个硬件上是这样。因此,一般来说,人们可能不依赖于相应的GLSL编译器优化。
发布于 2013-03-17 23:02:11
是对每个顶点执行projM * viewM * modelM矩阵乘法,还是足够智能地计算一次,直到统一变量更改后才重新计算?
请询问有问题的OpenGL实现的开发人员。OpenGL规范对此没什么可说的,但是驱动程序和GLSL编译器编写者可能已经为此实现了优化。
如果它还不够“聪明”,那么除了在CPU上计算所有与一致相关的值并将它们作为统一变量发送到之外,还有什么方法可以对它进行优化吗?
不是的。你得自己跑腿。
发布于 2013-03-17 23:06:12
所有OpenGL和GLSL优化都是特定于供应商的。很难判断glsl编译器的最终输出是什么。
您可以在此处查找供应商特定信息:http://renderingpipeline.com/graphics-literature/low-level-gpu-documentation/
对于你的代码,你总是可以将矩阵‘打包’到新的uniform:matModelViewProjection中,在应用程序中将其相乘,并将其发送到顶点着色器。
https://stackoverflow.com/questions/15462022
复制相似问题