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

C++ 将glm::mat4与模板类一起使用,比较typedef,c++,opengl,C++,Opengl,我正在使用SDL2和OpenGL编写一个游戏引擎,并尝试使用一个模板类为我的着色器设置一些制服 是否有人可以帮助我使用代码执行以下操作: 比较已解析变量的类型以检查它是否为矩阵 与vec3比较,然后使用value.x、value.y、value.z 将其与浮点数进行比较,然后简单地存储它 模板 void SetUniform(字符*统一,T值) { GLint loc=glGetUniformLocation(着色器[当前着色器],统一); 如果(loc!=-1) { if(typeid(T)=

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

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

  • 比较已解析变量的类型以检查它是否为矩阵
  • 与vec3比较,然后使用value.x、value.y、value.z
  • 将其与浮点数进行比较,然后简单地存储它
  • 模板
    void SetUniform(字符*统一,T值)
    {
    GLint loc=glGetUniformLocation(着色器[当前着色器],统一);
    如果(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
    其他的
    glUniform1f(loc,value);
    }
    }
    
    不用类型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);
        }
    }
    

    为什么不为您将要允许的每种类型的变量编写显式专门化呢?现在,您正在尝试做一些相当可疑的事情——如果typeid未知,则假定它是一个浮点标量。每次设置统一位置时,还可以通过字符串名称查询它,这很愚蠢。统一位置在链接后不会更改,您应该寻找一种方法,使用整数位置将统一传递给您的函数,而不是通过名称查询统一位置(这需要昂贵的字符串搜索操作)。很好的解决方案,很好而且干净,与我开始使用模板之前的工作非常相似。。。看起来我将使用这个,而不是让模板工作,这是一个遗憾。