如何从glGetAttribLocation获取glGetActiveAttrib索引?

时间:2019-02-21 16:01:20

标签: opengl shader opengl-3

我想查询给定属性的元数据。我希望我误解了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, ...) 

因此,我的问题是:

如何获取活动属性而不是位置的索引

我是否必须遍历所有所有属性,并检查名称是否与我的属性名称匹配?

1 个答案:

答案 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