我正在使用SDL2& amp;编写游戏引擎。 OpenGL和我正在尝试使用模板类为我的着色器设置一些制服。
有人可以帮助我使用我的代码执行以下操作:
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);
}
}
答案 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);
}
}