为什么评论glBindFragDataLocation,GL也能正常工作?

时间:2017-04-07 14:47:40

标签: 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);

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

1 个答案:

答案 0 :(得分:2)

因为你很“幸运”。如果不指定片段着色器输出位置,OpenGL规范不保证片段着色器输出位置的分配方式。它只说每个人都有一个单独的位置;这些地点取决于实施。

然而,考虑到写入单个输出变量而没有明确地将其分配给某个位置的大量代码,OpenGL实现将第一个FS输出位置分配给除0以外的任何其他位置的可能性极小。所以尽管如此这不是规范保证,在这一点上,它是实现的事实上的要求。

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

仅供参考:private static async Task CreateZipFile(string folderPath) { await Task.Run(() => { try { ZipFile.CreateFromDirectory(folderPath, ApplicationData.Current.LocalFolder.Path + "backup.zip"); } catch (Exception e) { ; } }); } 也适用于片段着色器输出。所以如果你在顶点属性上使用它,你应该使用它。然后,您不必担心从代码中执行此操作。