opengl - 如何将自定义 C++ 矩阵类传递给 glUniformMatrix

标签 opengl glsl shader

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

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

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

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

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

返回static_cast<const GLfloat*>(...)到矩阵数据结构的开头,这样它将以列方式指向所有矩阵。这是 GLM 库的工作原理吗?

最佳答案

各种glUniformMatrx*fv()函数期望矩阵是一系列 GLfloat 值(mat4 为 16),连续放置在内存中,因此传递指向 C/C++ 一维或二维 float 组的指针将起作用。

GLM 使用以下两种变体

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

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

关于opengl - 如何将自定义 C++ 矩阵类传递给 glUniformMatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899973/

相关文章:

opengl - 带有 EGL 的 Vulkan 接头

opengl - 三角形是GPU的限制还是其他渲染路径?

glsl - glsl片段着色器中的特定坐标输出?

javascript - WebGL:INVALID_VALUE:attachShader:没有对象或对象被删除。这暗地里有帮助吗?

c++ - 无法打开文件 'SOIL.libkernel32.lib'

c++ - 开箱过渡不是天衣无缝

opengl - GLSL 中统一和常量之间不同的浮点行为

c++ - 是否可以仅在片段着色器中创建纹理?

c++ - 在片段着色器中组合两个纹理

opengl - 有什么更好的方法来同步计算着色器的所有调用?