opengl 着色器坐标系

Posted

技术标签:

【中文标题】opengl 着色器坐标系【英文标题】:opengl shader Coordinate Systems 【发布时间】:2018-10-11 10:13:20 【问题描述】:

我在页面上学习 OpenGL:https://learnopengl.com/Getting-started/Coordinate-Systems 在示例中,他们使用 3 个矩阵(模型、视图、投影)并将所有内容推送到着色器程序。但是可以在 CPU 上计算 MVPmat = Projection * View * Model 并推送一次到着色器。

    使用3个矩阵:

    +使用 GPU。 +干净。 - 需要所有像素的计算器 MVPmat。 -使用 16 或 32 位计算器。

    在 CPU 上使用 MVPmat = 投影 * 视图 * 模型。

    +每个模型一次。 +使用 64 位计算器。 -使用 CPU。 -不干净。

什么是最好的方法?我在 GG 上找不到答案,或者我可能是愚蠢的。

P/S 对不起我的英语。 谢谢。

【问题讨论】:

【参考方案1】:

我不太清楚您所说的“干净”与“不干净”是什么意思。我也不确定为什么您认为在 CPU 上计算模型-视图-投影矩阵意味着必须使用 64 位精度来完成。当涉及到与图形相关的事情时,几乎不需要 64 位浮点运算。实际上,一般来说几乎不需要超过单精度浮点数。除非,例如,你正在做一些你真正需要精确度的科学计算……

回答您的问题:如果使用组合的模型-视图-投影矩阵足以满足您的需求,那么使用组合矩阵似乎是最佳解决方案。您只需计算一次组合矩阵。您只需将一个矩阵上传到 GPU,而不是三个。您只需在着色器中获取一个矩阵,而不是三个。您只需在着色器中进行一次矩阵向量乘法,而不是三次……

【讨论】:

1. “干净”与“不干净”是我自己的约定“gl_Position = projection * view * model * vec4(aPos, 1.0);”是数学之美。 2. 模型-视图-投影矩阵是最好的,但是为什么有些人在教授可以使用组合矩阵的时候使用 3 矩阵。我会要求作者得到答案。感谢您的帮助。 @TKNgu:使用 3 个矩阵的原因是,有时一些与图形相关的计算需要中间乘法步骤的结果。例如,您通常在乘以 Projection 之前但在乘以 Model-View 之后执行所有与光照相关的计算。

以上是关于opengl 着色器坐标系的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL着色器没有传递正确的纹理坐标

传递给片段着色器的纹理坐标全部为 0

OpenGL:只模糊纹理的一部分;可以使用顶点着色器加速吗?

片段着色器究竟如何用于纹理?

openGL着色器:两个对象和一条线来连接它们

顶点着色器的绘制操作