glBindAttribLocation,着色器中不存在名称参数

glBindAttribLocation, name parameter non-existent in shader

我一直在阅读这个问题和这里接受的答案: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 );
}

我想知道当提供的名称参数在着色器中的任何地方都不存在时调用 glBindAttribLocation 是否合适。

如果我们在这里读到:https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml,它表示 "It is also permissible to bind a generic attribute index to an attribute variable name that is never used in a vertex shader."

如果在着色器中定义了某个属性但未使用它,那么调用 glBindAttribLocation 似乎是可以的。我想知道如果该属性根本不存在是否可以。我的直觉是它很好,因为 glsl 编译器积极删除未使用的代码,但我似乎无法验证这一点。

为不存在的属性调用 glBindAttribLocation() 是完全合法的,而不是错误。 OpenGL规范中特别提到了这一点。以下内容来自 OpenGL 4.5 规范的第 365 页,第 11.1.1 节 "Vertex Attributes":

BindAttribLocation may be issued before any vertex shader objects are attached to a program object. Hence it is allowed to bind any name to an index, including a name that is never used as an attribute in any vertex shader object. Assigned bindings for attribute variables that do not exist or are not active are ignored.