我一直在阅读这个问题和接受的答案:Explicit vs Automatic attribute location binding for OpenGL shaders
我已经存储了一个硬编码的字符串数组,以表示要使用的顶点着色器的可用属性。在加载着色器的过程中,我指定了如下属性位置:
for ( int i = 0; i < Attribute::eCount; ++i )
{
const char* name = attributeTable.Find( i );
glBindAttribLocation( program, i, (const GLchar*)name );
}
我想知道在着色器中任何地方都不存在提供的name参数时调用glBindAttribLocation是否合适。
如果我们在这里阅读:https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml,它表示“也允许将通用属性索引绑定到从未在顶点着色器中使用的属性变量名称。”
如果在着色器中定义了属性但未使用属性,则可以调用glBindAttribLocation。我想知道如果该属性根本不存在是否可以。我的预感是,它很好,因为glsl编译器积极地删除未使用的代码,但我似乎无法验证这一点。
答案 0 :(得分:2)
调用glBindAttribLocation()
以查找不存在的属性是完全合法的,而不是错误。这在OpenGL规范中特别提到。以下内容来自OpenGL 4.5规范的第365页,第11.1.1节和第34节;顶点属性&#34;:
可以在将任何顶点着色器对象附加到程序对象之前发出BindAttribLocation。因此,允许将任何名称绑定到索引,包括从未在任何顶点着色器对象中用作属性的名称。为不存在或不活动的属性变量分配的绑定将被忽略。