如何从 glGetAttribLocation 到 glGetActiveAttrib 索引?
How to get from glGetAttribLocation to glGetActiveAttrib index?
我想查询给定属性的元数据。我希望我误解了 glGetActiveAttrib
的工作原理。以下是我认为它是如何工作的:
属性location可以获得using glGetAttribLocation(programId, attributeName)
. Metadata can be obtained using glGetActiveAttrib(programId, index, ...)
.
如您所见,glGetActiveAttrib
需要 index 而不是位置。
这是不一样的。
示例:
在着色器中:
attribute vec3 position;
attribute vec3 textureCoordinate; // <-- this attribute is not used
attribute vec3 normal;
在此示例中,属性 locations 将为
locations = [
position: 0,
textureCoordinate: -1, // optimized away
normal: 2, // continues counting the attributes
]
但是,活动属性 indices 将是
active_attribute_indices = [
position: 0,
// skips texture coordinate because it is not active
normal: 1,
]
如您所见,以下将不起作用:
// get attribute location by name
int attrib_location = glGetAttribLocation(programId, "normal"); // = 2
// get attribute metadata
// Error: attrib_location being 2 is not a valid active attribute index.
glGetActiveAttrib(programId, attrib_location, ...)
因此,我的问题是:
如何获取活动属性的 index,而不是位置?
我是否必须遍历 所有 属性并检查名称是否与我的属性名称匹配?
在old introspection API下,无法通过名称检索属性索引。所以你必须遍历属性列表才能找到它。
下更modern introspection API (available to GL 4.3 and via extension), you can query any named resource index by name (assuming your shader is not a SPIR-V shader) via glGetProgramResourceIndex
。对于顶点着色器输入,您传递接口 GL_PROGRAM_INPUT
.
我想查询给定属性的元数据。我希望我误解了 glGetActiveAttrib
的工作原理。以下是我认为它是如何工作的:
属性location可以获得using glGetAttribLocation(programId, attributeName)
. Metadata can be obtained using glGetActiveAttrib(programId, index, ...)
.
如您所见,glGetActiveAttrib
需要 index 而不是位置。
这是不一样的。
示例:
在着色器中:
attribute vec3 position;
attribute vec3 textureCoordinate; // <-- this attribute is not used
attribute vec3 normal;
在此示例中,属性 locations 将为
locations = [
position: 0,
textureCoordinate: -1, // optimized away
normal: 2, // continues counting the attributes
]
但是,活动属性 indices 将是
active_attribute_indices = [
position: 0,
// skips texture coordinate because it is not active
normal: 1,
]
如您所见,以下将不起作用:
// get attribute location by name
int attrib_location = glGetAttribLocation(programId, "normal"); // = 2
// get attribute metadata
// Error: attrib_location being 2 is not a valid active attribute index.
glGetActiveAttrib(programId, attrib_location, ...)
因此,我的问题是:
如何获取活动属性的 index,而不是位置?
我是否必须遍历 所有 属性并检查名称是否与我的属性名称匹配?
在old introspection API下,无法通过名称检索属性索引。所以你必须遍历属性列表才能找到它。
下更modern introspection API (available to GL 4.3 and via extension), you can query any named resource index by name (assuming your shader is not a SPIR-V shader) via glGetProgramResourceIndex
。对于顶点着色器输入,您传递接口 GL_PROGRAM_INPUT
.