Opengl 为什么要注释glBindFragDataLocation,GL也可以正常工作?

Opengl 为什么要注释glBindFragDataLocation,GL也可以正常工作?,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,无论我是否添加glBindFragDataLocation,GL都能正常工作,为什么?因为你“幸运”。如果不指定片段着色器输出位置,则OpenGL规范不保证如何指定它们。它只说每一个都有一个单独的位置;具体位置取决于实施情况 但是,考虑到写入单个输出变量而不显式将其分配给位置的代码量,OpenGL实现将第一个FS输出位置分配给0以外的任何对象的可能性很小。因此,虽然它不是一个规范保证,但在这一点上,它是实现的一个事实上的需求 注意:这并不意味着您不应该手动分配该位置。最好总是站在安全和明确的一边

无论我是否添加glBindFragDataLocation,GL都能正常工作,为什么?

因为你“幸运”。如果不指定片段着色器输出位置,则OpenGL规范不保证如何指定它们。它只说每一个都有一个单独的位置;具体位置取决于实施情况

但是,考虑到写入单个输出变量而不显式将其分配给位置的代码量,OpenGL实现将第一个FS输出位置分配给0以外的任何对象的可能性很小。因此,虽然它不是一个规范保证,但在这一点上,它是实现的一个事实上的需求

注意:这并不意味着您不应该手动分配该位置。最好总是站在安全和明确的一边


仅供参考:
布局(位置)
也适用于片段着色器输出。所以如果在顶点属性上使用它,应该使用它。这样,您就不必担心从代码中执行此操作。

因为0很可能是第一个输出变量被分配的默认位置。但这并不能保证。
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);