将glm :: mat4与模板类一起使用,比较typedef

时间:2014-06-01 20:42:04

标签: c++ opengl

我正在使用SDL2& amp;编写游戏引擎。 OpenGL和我正在尝试使用模板类为我的着色器设置一些制服。

有人可以帮助我使用我的代码执行以下操作:

  1. 比较解析变量的类型以检查它是否为矩阵
  2. 与vec3比较,然后使用value.x,value.y,value.z
  3. 与浮动比较然后只需存储它。
  4.   template <class T>
      void SetUniform(char* uniform, T value)
      {
         GLint loc = glGetUniformLocation(shaders[current_shader], uniform);
         if (loc != -1)
         {
            if (typeid(T) == typeid(glm::mat4))
               glUniformMatrix4fv(loc, 1, GL_FALSE, value); // &mat4[0][0]
            else if (typeid(T) == typeid(int))
               glUniform1i(loc, value);
            else if (typeid(T) == typeid(glm::vec3))
               glUniform3f(loc, value.x, value.y, value.z); // vec3
            else
               glUniform1f(loc, value);
         }
     }
    

1 个答案:

答案 0 :(得分:1)

不是使用type-id(这里是一个过度杀手),你可以优雅地重载,而不需要运行时成本:

void SetUniform(const glm::mat4& mat, char *uniform)
{
    GLint loc = glGetUniformLocation(shaders[current_shader], uniform);
    if (loc != -1)
    {
        glUniformMatrix4fv(loc, 1, GL_FALSE, &mat[0][0]); // &mat4[0][0]
    }
}

void SetUniform(const glm::vec3& v, char *uniform)
{
    GLint loc = glGetUniformLocation(shaders[current_shader], uniform);
    if (loc != -1)
    {
        glUniform3f(loc, v.x, v.y, v.z);
    }
}

void SetUniform(float f, char *uniform)
{
    GLint loc = glGetUniformLocation(shaders[current_shader], uniform);
    if (loc != -1)
    {
        glUniform1f(loc, f);
    }
}