OpenGL - 矩阵逻辑错误

Posted

技术标签:

【中文标题】OpenGL - 矩阵逻辑错误【英文标题】:OpenGL - Matrix Logic Error 【发布时间】:2016-05-31 15:28:53 【问题描述】:

我单独使用模型矩阵将我加载的模型(来自 Blender 的猴脸)传输到 vbo 从模型空间到世界空间。然而,模型非常扭曲(拉伸到无穷大),我很困惑为什么会发生这种情况。

This video 显示模型围绕 y 轴不断旋转,以试图清楚地显示我的问题。我确定我加载的 OBJ 模型是有效的。熔岩纹理已绑定到模型以使其更易于查看。

该视频还显示了控制台,该控制台显示了我发送到顶点着色器的当前矩阵。在内存中,矩阵以行优先顺序表示,所以如下矩阵:

|1 0 0 0 |
|0 1 0 0 |
|0 0 1 10|
|0 0 0 1 |

作为以下 C++ 浮点数组发送到我的顶点着色器:

1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 10, 0, 0, 0, 1

我相信我在数学上犯了一个新手错误。仅从模型中可以发现任何明显的错误吗?在我的顶点着色器 (GLSL) 中,我使用以下代码行:

gl_Position = mvp * vec4(position, 1.0);

其中“mvp”是在视频中看到的结果矩阵,位置包含正在处理的模型的当前顶点的位置(在模型空间中)。我不明白为什么会出现这些扭曲,这可能是我程序的另一个方面的错误(即我没有显示足够的代码)吗?

【问题讨论】:

发送行矩阵时是否使用traspose 标志? 我不这样做,我尝试这样做,但模型变得不可见,因为在我的示例中,'10' 的值将位于第四行而不是第四列,如果我这样做违反了 OpenGL 的顺序没记错。 不,这只是意味着您的数据不在裁剪空间的单位立方体内并被裁剪 现在我想起来了,我生成翻译矩阵的函数以列主要格式返回正确的矩阵,我多次尝试换位,尽管它可能仍然是我正在犯的错误.编辑:没有透视投影,你知道默认的远剪辑,就世界空间而言? 我只是将浮点数从 10 减少到 0.5,并缩小了模型。现在可以正确渲染了,非常感谢 Beyeler! 【参考方案1】:

结果矩阵的必需转置。以前没有解决这个问题,因为位置超出了默认的远剪辑,所以模型被剪辑了。

【讨论】:

以上是关于OpenGL - 矩阵逻辑错误的主要内容,如果未能解决你的问题,请参考以下文章

围绕世界轴OpenGL旋转对象

opengl 矩阵问题

C ++ / OpenGL glm无法将矩阵插入着色器中的统一

OPENGL之矩阵

无法将我的 mat4 转换矩阵解析为我的 opengl 着色器?

QT 开发opengl 错误1