考虑典型的“朴素”顶点着色器:
in vec3 aPos;
uniform mat4 uMatCam;
uniform mat4 uMatModelView;
uniform mat4 uMatProj;
void main () {
gl_Position = uMatProj * uMatCam * uMatModelView * vec4(aPos, 1.0);
}
当然,传统观点会建议“每个顶点乘以三个 mat4,其中两个即使在当前着色器程序中的多个后续 glDrawX() 调用中也是一致的,至少这两个应该在 CPU 端进行预乘,可能甚至三个。”
我想知道现代 GPU 是否已将此用例优化到 CPU 端预乘不再是性能优势的程度。当然,纯粹主义者可能会说“这取决于最终用户的 OpenGL 实现”,但对于这个用例,我们可以放心地假设它将是提供该实现的当前一代支持 OpenGL 4.2 的 nVidia 或 ATI 驱动程序。
根据您的经验,考虑到我们可能会在每个 UseProgram() 过程中“绘制”一百万个左右的顶点——每个 UseProgram() 至少会预乘前两个(透视投影和相机变换矩阵),从而将性能提升到任何显着程度?每个 Draw() 调用的所有三个呢?
当然,这都是关于基准测试......但我希望有人拥有我错过的基于当前一代硬件实现的基本见解,这可能表明“甚至不值得一试,不要浪费你的时间”或“无论如何都要这样做,因为您当前没有预乘的着色器将是纯粹的精神错乱” ......想法?