我正在尝试将数组的统一位置保存到Shader类中的std::map中。
我的顶点着色器有一个统一到mat4的数组。
uniform mat4 bone_matrices[32];
在下面的代码中,骨骼矩阵名称显示为bone_matrices。所以我只获取第一个数组成员的位置。我认为其他的是连续的。
class Shader
{
...
private:
GLuint mi_program;
std::map<std::string, GLint> m_maplocations;
};
void Shader::mapLocations()
{
GLint numUniforms = 0;
const GLenum properties[5] = {GL_BLOCK_INDEX, GL_TYPE, GL_NAME_LENGTH, GL_LOCATION, GL_ARRAY_SIZE};
glGetProgramInterfaceiv(mi_program, GL_UNIFORM, GL_ACTIVE_RESOURCES, &numUniforms);
for(int unif = 0; unif < numUniforms; ++unif)
{
GLint values[5];
glGetProgramResourceiv(mi_program, GL_UNIFORM, unif, 5, properties, 5, NULL, values);
// Skip any uniforms that are in a block.
if(values[0] != -1)
continue;
std::string nameData;
nameData.resize(values[2]);
if(values[4] > 1)
{
// **have an array here**
}
glGetProgramResourceName(mi_program, GL_UNIFORM, unif, nameData.size(), NULL, &nameData[0]);
std::string name(nameData.begin(), nameData.end() - 1);
m_maplocations.insert(std::pair<std::string, GLint>(name, values[3]));
}
}
我如何迭代bone_matrices数组,获得它们的名称: bone_matrices,bone_matrices1,...和地点。谢谢..
发布于 2018-06-03 06:52:50
如何迭代bone_matrices数组,获得它们的名称: bone_matrices,bone_matrices1,...和地点。
只有一种统一:bone_matrices
。这件制服是一件array of basic types, so it is considered a single resource。每个数组元素都有一个位置,但仍然只有一个统一。
如果要测试制服是否已排列,请使用GL_ARRAY_SIZE
属性获取制服的大小。如果此值大于1,则可以通过循环查询每个数组元素的位置。
所有这些都是这样说的:
我正在尝试将数组的统一位置保存到我的Shader类中的std::map中。
请不要这样做。首先,您的std::map
-based代码不会比glGetUniformLocation
或glGetProgramResourceLocation
快。因此,如果您要经常通过字符串名称查询制服,那么您也可以只使用现有的API。
其次,由于您正在使用程序资源,这是GL4.3的一个特性,因此我必须假设您有访问explicit uniform locations的权限。因此,应将制服指定给着色器中的特定位置,然后根本无需查询任何内容。
即使你正在编写一个程序,它必须与用户提供的任何内容一起工作,但对他们来说,提供特定的位置仍然更好。
我的意思是这个。假设您期望用户提供一个名为bone_matrices
的矩阵数组。因此,将您的期望更改为用户将在某个特定的统一位置X提供一个矩阵数组。
是的,这意味着你必须划分你的制服空间。但这比运行每个着色器来查询其数据要好得多。您不必拥有从字符串到位置的映射;您只需拥有它所期望的位置。
https://stackoverflow.com/questions/50661621
复制相似问题