如何将自定义c ++矩阵类传递给glUniformMatrix

时间:2013-07-27 16:24:02

标签: opengl glsl shader

是否可以创建一个c ++自定义矩阵类,以便我们可以将此类的实例传递给glUniformMatrix?换句话说,将此类的实例传递给顶点着色器。

我问这个问题,因为当我做计算机图形学课程时,我们获得了opengl和glsl着色器编程的代码框架。在代码框架中,我们有一个名为mat4的自定义c ++矩阵类。这个类包含许多方法和用户定义的构造函数。但仍然将mat4的实例用作glUniformMatrix的参数,并且这些实例在顶点着色器中正确转换为mat4类型。

将来我想使用GLM library来创建opengl代码与顶点/片段着色器之间的接口,但我想了解哪些数据类型可以传递给glUniformMatrix的规则和语义,这样实例这些类型将在顶点着色器中正确转换为统一的mat4。

我认为这种行为的关键是定义运算符

operator GLfloat* (); 
operator const GLfloat* () const;

static_cast<const GLfloat*>(...)返回到矩阵数据结构的开头,使得它将以列方式指向所有矩阵。 GLM图书馆是如何运作的?

1 个答案:

答案 0 :(得分:2)

各种glUniformMatrx*fv()函数期望矩阵是一系列GLfloat值(mat4为16),连续布局在内存中,因此将指针传递给C / C ++一个或两个 - 维数的浮点阵列将起作用。

GLM使用以下两种变体

glm::mat4 m;
glUniform4fv(location, 1, GL_FALSE, &m[0][0]);
// or
glUniform4fv(location, 1, GL_FALSE, glm::value_ptr(m));

他们明确地避免实现隐藏该操作的某种机制,尽管它很容易实现。