我想查询给定属性的元数据。我希望我误解了glGetActiveAttrib
的工作方式。这是我认为的工作方式:
可以获取属性{em>位置 using glGetAttribLocation(programId, attributeName)
。可以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, ...)
因此,我的问题是:
如何获取活动属性而不是位置的索引?
我是否必须遍历所有所有属性,并检查名称是否与我的属性名称匹配?
答案 0 :(得分:3)
在old introspection API下,无法通过名称检索属性索引。因此,您必须遍历属性列表才能找到它。
在modern introspection API(适用于GL 4.3和via extension)下,您可以通过query any named resource index by name not a SPIR-V shader(假设着色器为glGetProgramResourceIndex
)。对于顶点着色器输入,您通过接口GL_PROGRAM_INPUT
。