【问题标题】:how to pass a custom c++ matrix class to glUniformMatrix如何将自定义 C++ 矩阵类传递给 glUniformMatrix
【发布时间】:2013-07-27 19:44:30
【问题描述】:

是否可以创建一个 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 库是如何工作的?

【问题讨论】:

  • 您使用的是 Angel 图形教科书中的代码吗?它使用您在帖子中描述的机制允许您简单地将变量名称传递给glUniformMatrix。一般来说,C++ 狂热者不喜欢这些方法,但它们在这种情况下很有用。 GLM 不使用相同的机制,但如果需要,您始终可以从这些类派生以添加这些方法。就个人而言,我喜欢转换运算符,因为其他方法依赖于公开类的实现。
  • 我记得我在 Google 搜索中找到了 angels 代码,它看起来与我们的计算机图形课程代码中的代码相同。我认为课程人员使用了 Angels 代码并对其进行了调整以符合课程约定。

标签: opengl glsl shader


【解决方案1】:

各种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));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多