为什么评论 glBindFragDataLocation,GL 也能正常工作?
Why comment glBindFragDataLocation, the GL also works correctly?
const GLchar* vertexSource1 = "#version 330 core\n"
"layout (location = 0) in vec2 position;\n"
"layout (location = 1) in vec3 color;\n"
"out vec3 Color;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position, 0.0, 1.0);\n"
"Color = color;\n"
"}[=10=]";
const GLchar* fragmentSource1 = "#version 330 core\n"
" in vec3 Color;\n"
" out vec4 outColor;\n"
" void main()\n"
" {\n"
" outColor = vec4(Color, 1.0);\n"
" }\n";
GLuint shaderProgram1 = glCreateProgram();
glAttachShader(shaderProgram1, vertexShader1);
glAttachShader(shaderProgram1, fragmentShader1);
// glBindFragDataLocation(shaderProgram1, 0, "Color");
glLinkProgram(shaderProgram1);
无论我是否添加 glBindFragDataLocation,GL 都能正常工作,为什么?
因为你 "lucky"。如果您不分配片段着色器输出位置,则 OpenGL 规范不提供有关如何分配它们的保证。它只是说每个人都有一个单独的位置;这些是什么位置取决于实施。
但是,考虑到写入单个输出变量而未明确将其分配给位置的代码量巨大,OpenGL 实现极不可能将第一个 FS 输出位置分配给 0 以外的任何值。所以虽然这不是规范保证,但在这一点上,它是实现的实际要求。
注意:这并不意味着您不应该手动分配该位置。始终保持安全和明确的一面是最好的。
仅供参考:layout(location)
也适用于片段着色器输出。所以如果你在顶点属性上使用它,你应该使用它。然后你就不用担心从代码中做到这一点了。
const GLchar* vertexSource1 = "#version 330 core\n"
"layout (location = 0) in vec2 position;\n"
"layout (location = 1) in vec3 color;\n"
"out vec3 Color;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position, 0.0, 1.0);\n"
"Color = color;\n"
"}[=10=]";
const GLchar* fragmentSource1 = "#version 330 core\n"
" in vec3 Color;\n"
" out vec4 outColor;\n"
" void main()\n"
" {\n"
" outColor = vec4(Color, 1.0);\n"
" }\n";
GLuint shaderProgram1 = glCreateProgram();
glAttachShader(shaderProgram1, vertexShader1);
glAttachShader(shaderProgram1, fragmentShader1);
// glBindFragDataLocation(shaderProgram1, 0, "Color");
glLinkProgram(shaderProgram1);
无论我是否添加 glBindFragDataLocation,GL 都能正常工作,为什么?
因为你 "lucky"。如果您不分配片段着色器输出位置,则 OpenGL 规范不提供有关如何分配它们的保证。它只是说每个人都有一个单独的位置;这些是什么位置取决于实施。
但是,考虑到写入单个输出变量而未明确将其分配给位置的代码量巨大,OpenGL 实现极不可能将第一个 FS 输出位置分配给 0 以外的任何值。所以虽然这不是规范保证,但在这一点上,它是实现的实际要求。
注意:这并不意味着您不应该手动分配该位置。始终保持安全和明确的一面是最好的。
仅供参考:layout(location)
也适用于片段着色器输出。所以如果你在顶点属性上使用它,你应该使用它。然后你就不用担心从代码中做到这一点了。