【发布时间】:2016-10-11 17:14:18
【问题描述】:
我目前正在编写一个 openGL 着色器类。我没有尝试设置每个统一类型的函数,而是尝试将统一函数(例如 glUniform1f)作为参数传递。
我目前的尝试看起来像这样:
template <typename T1>
void Shader::setUniform(void (* fnc)(GLint, T1), const GLchar *name, const T1 value1)
{
fnc(getUniformLocation(name), value1);
}
调用
shader.setUniform<GLfloat>(*glUniform1f, "test", 5);
但是,我经常遇到以下转换错误:
cannot convert argument 1 from 'void (__stdcall *)(GLint,GLfloat)' to 'void (__cdecl *)(GLint,GLfloat)'
是否可以按预期工作?
谢谢
注意:如果这很重要,我正在使用 GLEW 和 glfw
【问题讨论】:
-
我对 openGL 不熟悉,但您是否尝试过通过
std::function而不是函数指针来传递函数? -
还没有,等一下。
-
一个更好的问题是......你为什么要这样做?您的目标似乎是为
glUniform系列函数提供模板包装器。但是你这样做的方式需要用户同时传递类型(GLfloat)和函数指针,它......已经具有类型。必须有更好的方法来做你似乎想做的事情。 -
基本思想是拥有一个单一的功能,而不是太多,例如void setUniform1f(const GLchar *name, float value); void setUniform1i(const GLchar *name, int value);
-
@LevyEhrstein:但你没有实现这一目标。您仍然需要输入您要调用的函数的名称。用户仍然必须记住他们真正想要调用的函数。您并没有隐瞒用户提供“太多”功能的事实。那么 API 有什么好处呢?