首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数组的glUniformLocation

数组的glUniformLocation
EN

Stack Overflow用户
提问于 2018-06-03 06:18:12
回答 1查看 92关注 0票数 0

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

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

代码语言:javascript
复制
uniform mat4 bone_matrices[32];

在下面的代码中,骨骼矩阵名称显示为bone_matrices。所以我只获取第一个数组成员的位置。我认为其他的是连续的。

代码语言:javascript
复制
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,...和地点。谢谢..

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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代码不会比glGetUniformLocationglGetProgramResourceLocation快。因此,如果您要经常通过字符串名称查询制服,那么您也可以只使用现有的API。

其次,由于您正在使用程序资源,这是GL4.3的一个特性,因此我必须假设您有访问explicit uniform locations的权限。因此,应将制服指定给着色器中的特定位置,然后根本无需查询任何内容。

即使你正在编写一个程序,它必须与用户提供的任何内容一起工作,但对他们来说,提供特定的位置仍然更好。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50661621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档