Vic*_*r S 2 opengl glsl opengl-3
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"
"}\0";
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);
Run Code Online (Sandbox Code Playgroud)
无论我是否添加 glBindFragDataLocation,GL 都能正常工作,为什么?
因为你很“幸运”。如果不分配片段着色器输出位置,OpenGL 规范不保证如何分配它们。它只是说每个人都有一个单独的位置;这些位置取决于实施。
但是,考虑到写入单个输出变量而不将其显式分配给某个位置的大量代码,OpenGL 实现极不可能将第一个 FS 输出位置分配给 0 以外的任何其他位置。因此虽然它不是规范保证,在这一点上,它是实现的事实上的要求。
注意:这并不意味着您不应手动分配该位置。始终保持安全和明确的一面总是最好的。
仅供参考:也layout(location)适用于片段着色器输出。所以如果你在顶点属性上使用它,你应该使用它。然后您不必担心从代码中执行此操作。