Sar*_*sch 8 opengl optimization glsl compiler-optimization
例如,如果我使用如下的顶点着色器:
#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;
}
Run Code Online (Sandbox Code Playgroud)
它是否会projM * viewM * modelM为每个顶点进行矩阵乘法,或者它是否足够智能来计算是否一次并且在重新计算变量之前不重新计算?如果它不够"足够聪明",那么有没有办法优化它,除了计算CPU上所有统一相关值并将它们作为统一变量发送到GPU?
此外,我对可以在没有问题的情况下移植到OpenGL ES 2.0的解决方案感兴趣.
Sar*_*sch 10
因此,据我所知,没有一般答案.不过,我对我的硬件进行了一些测试.我的库存中有2个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
Run Code Online (Sandbox Code Playgroud)
cpu上的矩阵乘法:
intel:
sphere400: 57.37234652897303 fps
sphere40: 128.2051282051282 fps
nvidia:
sphere400: 142.28799089356858 fps
sphere40: 247.1576866040534 fps
Run Code Online (Sandbox Code Playgroud)
测试表明,在顶点着色器中乘法(均匀)矩阵是个坏主意,至少在这个硬件上是这样.所以一般来说,可能不依赖于相应的GLSL编译器优化.