2017-04-07 103 views
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); 

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

+0

因为0很可能是第一个输出变量被赋值的默认位置。但(afaik)不能保证。 – BDL

回答

2

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

但是,考虑到写入单个输出变量而没有将其明确分配给某个位置的代码量很大,OpenGL实现很可能永远不会将第一个FS输出位置分配给除0以外的任何其他位置。它不是一个规范保证,在这一点上,它是实现的事实上的要求。

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

供参考:layout(location)也适用于片段着色器输出。所以如果你在顶点属性上使用它,你应该使用它。那么你不必担心从代码中执行它。