我想查询给定属性的元数据。我希望我误解了glGetActiveAttrib
是如何工作的。这就是我认为它是如何工作的:
属性位置可以获得using glGetAttribLocation(programId, attributeName)
。元数据可以获得using glGetActiveAttrib(programId, index, ...)
。
如您所见,glGetActiveAttrib
期望索引而不是位置。这不一样。
在着色器中:
attribute vec3 position;
attribute vec3 textureCoordinate; // <-- this attribute is not used
attribute vec3 normal;
在此示例中,属性位置将是
locations = [
position: 0,
textureCoordinate: -1, // optimized away
normal: 2, // continues counting the attributes
]
但是,活动属性索引将是
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, ...)
因此,我的问题是:
如何获取活动属性的索引,而不是位置?
我是否必须遍历所有属性并检查名称是否与我的属性名称匹配?
在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
。