我在看一个phong照明着色器的代码示例。它在顶点着色器中使用了gl_Normal,gl_Vertex和gl_ModelViewProjectionMatrix的预定义变量。我当前的顶点着色器看起来像这样。
#version 150 core
in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
out vec4 pass_Color;
out vec2 pass_TextureCoord;
void main(void) {
gl_Position = projection * view * model * in_Position;
pass_Color = in_Color;
pass_TextureCoord = in_TextureCoord;
}
我想知道是否可以设置预定义变量的值。例如,我将gl_ModelViewProjectionMatrix的值设置为我的投影制服。我之所以这样问,是因为每当我尝试使用预定义的var时,着色器将无法工作。
最佳答案
像gl_ProjectionMatrix
这样的预定义变量仅在兼容性配置文件中可用。由于您为着色器指定了核心配置文件,因此您将无法使用它们:
#version 150 core
如果您使用的是兼容性配置文件(我绝不建议这样做),则可以使用它们。然后,您可以使用以下命令设置
gl_ProjectionMatrix
的值:glMatrixMode(GL_PROJECTION);
glLoadMatrix(...);
这些当然也是兼容性配置文件调用,在核心配置文件中不可用。但这实际上没有比通过
projection
调用设置glUniformMatrix4fv()
统一值简单得多的方法。因此,没有充分的理由回到过去。我在以下答案中写了一个更详细的描述,其中介绍了内置GLSL变量在过渡到核心配置文件时发生了什么:GLSL - Using custom output attribute instead of gl_Position。