统一变量的操作是否在GLSL中缓存?

Bob*_*y-Z 2 opengl shader 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);
}
Run Code Online (Sandbox Code Playgroud)

变量是否mvp为每个顶点重新计算,或者是否预先计算并存储,直到它取决于变化的统一变量?

Nic*_*las 6

某个特定的实现可以缓存该值吗?当然.他们会吗?

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

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

  • 计算依赖树很简单。在编译过程中,您会找到“mat4”的初始化表达式中引用的所有变量,查明所有这些变量是否都是统一的,如果不是,则递归检查这些变量是否仅依赖于统一变量。大多数现代编译器对变量执行类似的操作。 (2认同)