2017-08-24 30 views
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重新计算每个顶点,或者是预先计算和存储,直到它依靠变化的均匀变量?

回答

6

特定的实现可以缓存那个值吗?当然。他们会吗?

我不会认为他们会。这种缓存很难实现,因为它需要在绘制调用之前根据统一状态评估这些表达式,然后将这些表达式上传到代码中。

如果您有一些状态是从多个统一值计算出来的,并且您认为这样的计算会是性能问题,那么您应该计算它。

+0

为什么难以实施?你只需要在编译过程中为变量创建一个依赖关系树,然后更新所有依赖于任何变化的统一变量的变量。 –

+0

@ Bobby-Z:你说“只是”,就好像那是微不足道的。它还要求你实现一个任意的表达式计算器,它可以根据输入的统一的当前值计算该“依赖关系树”的值。还有一个事实是,制服占用着色资源,这是有限的。你会有效地创建第四个“mat4”统一值。如果制造出来的制服之一是什么推动你超过舞台上统一的限制,会发生什么? –

+0

计算依赖关系树是微不足道的。在编译过程中,你会发现'mat4'的初始化表达式中引用的所有变量,找出所有这些变量是否均匀,或者如果不是,则递归检查这些变量是否仅依赖于统一变量。大多数现代编译器都用变量来做类似的事情。 –

相关问题