在OpenGL着色器

时间:2017-08-09 20:03:32

标签: c++ arrays opengl matrix

我有两个统一的数组

uniform mat4 uLightSpaceMatrices[6];
uniform float uDepthSplits[kMaxCascades];

其中kMaxCascades定义如下

const int kMaxCascades = 4;

我能正确设置值的唯一方法是为数组中的每个元素获取单独的统一位置:

  1. 对于矩阵数组

    template <std::size_t size>
    void setUniformArray(const std::string& uniformName, const std::array<glm::mat4, size>& matrices) {
          for(int i = 0; i < matrices.size(); ++i) {
               glUniformMatrix4fv(glGetUniformLocation(mName, (uniformName + "[" + std::to_string(i) + "]").c_str()), 1, GL_FALSE, glm::value_ptr(matrices[i]));
          }
    }
    
  2. 对于浮动数组

    for(int i = 0; i < cascades.splits.size(); ++i) {
         std::string name = "uDepthSplits";
         std::string fullName = name + "[" + std::to_string(i) + "]";
         glUniform1f(glGetUniformLocation(mName, fullName.c_str()), cascades.splits[i]);
    }
    

    分割是std::vector< float >

  3. 的地方

    现在,什么不起作用,但应该(我认为):

    1. 对于矩阵数组

      只需调用指定矩阵数的glUniformMatrix4fv

      template <std::size_t size>
      void setUniformArray(const std::string& uniformName, const std::array<glm::mat4, size>& matrices) {
          glUniformMatrix4fv(glGetUniformLocation(mName, uniformName.c_str()), matrices.size(), GL_FALSE, matrices.data());
      }
      
    2. 对于浮动数组

      glUniform1fv(glGetUniformLocation(mName, "uDepthSplits"), cascades.splits.size(), cascades.splits.data());
      
    3. 问题是为什么一种方法有效,另一种方法不起作用?

0 个答案:

没有答案