首页 > 解决方案 > glUniformLocation 数组

问题描述

我正在尝试将数组的统一位置保存到我的 Shader 类中的 std::map 中。

我的顶点着色器有一个到 mat4 的数组制服。

uniform mat4 bone_matrices[32];

在以下代码中,骨骼矩阵名称显示为 bone_matrices[0]。所以我只得到第一个数组成员的位置。[我认为其他是顺序的。]

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[0]、bone_matrices[1]、...和位置。谢谢..

标签: opengl

解决方案


如何迭代 bone_matrices 数组,获取它们的名称:bone_matrices[0]、bone_matrices 1、...和位置。

有一种制服:bone_matrices. 这个uniform是一个基本类型的数组,所以它被认为是一个单一的资源。每个数组元素都有一个位置,但仍然只有一个制服。

如果要测试是否排列了制服,请使用GL_ARRAY_SIZE属性获取制服的大小。如果该值大于 1,则可以通过循环查询每个数组元素的位置。

说了这么多:

我正在尝试将数组的统一位置保存到我的 Shader 类中的 std::map 中。

请不要这样做。首先,std::map基于 - 的代码不会glGetUniformLocationor快glGetProgramResourceLocation。因此,如果您要不断地通过字符串名称查询制服,您不妨只使用现有的 API。

其次,由于您使用的是程序资源,这是 GL 4.3 的一项功能,我必须假设您可以访问明确的统一位置。因此,您应该将制服分配给着色器中的特定位置,然后您根本不需要查询任何内容。

即使您正在编写一个必须与用户提供给您的任何东西一起工作的程序,他们仍然最好提供特定的位置。

我的意思是这个。假设您期望用户将提供一个名为 的矩阵数组bone_matrices。因此,将您的期望更改为用户将在某个特定的统一位置 X 处提供矩阵数组。

是的,这意味着您必须划分统一空间。但这比运行每个着色器来查询其数据要好得多。您不必拥有从字符串到位置的地图;您只需拥有它期望的位置。


推荐阅读