2
比方说,我有一个非常简单的GLSL顶点着色器:统一变量的操作是否被缓存在GLSL中?
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
in vec3 position;
in vec3 color;
out vec3 vertexColor;
void main()
{
mat4 mvp = projection * view * model;
vertexColor = color;
gl_Position = mvp * vec4(position, 1.0);
}
是变量mvp
重新计算每个顶点,或者是预先计算和存储,直到它依靠变化的均匀变量?
为什么难以实施?你只需要在编译过程中为变量创建一个依赖关系树,然后更新所有依赖于任何变化的统一变量的变量。 –
@ Bobby-Z:你说“只是”,就好像那是微不足道的。它还要求你实现一个任意的表达式计算器,它可以根据输入的统一的当前值计算该“依赖关系树”的值。还有一个事实是,制服占用着色资源,这是有限的。你会有效地创建第四个“mat4”统一值。如果制造出来的制服之一是什么推动你超过舞台上统一的限制,会发生什么? –
计算依赖关系树是微不足道的。在编译过程中,你会发现'mat4'的初始化表达式中引用的所有变量,找出所有这些变量是否均匀,或者如果不是,则递归检查这些变量是否仅依赖于统一变量。大多数现代编译器都用变量来做类似的事情。 –