如何从glGetAttribLocation到glGetActiveAttrib索引?

问题描述 投票:1回答:1

我想查询给定属性的元数据。我希望我误解了glGetActiveAttrib是如何工作的。这就是我认为它是如何工作的:

属性位置可以获得using glGetAttribLocation(programId, attributeName)。元数据可以获得using glGetActiveAttrib(programId, index, ...)

如您所见,glGetActiveAttrib期望索引而不是位置。这不一样。

Example:

在着色器中:

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, ...) 

因此,我的问题是:

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

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

opengl shader opengl-3
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.