首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我应该使用世界矩阵吗?

我应该使用世界矩阵吗?
EN

Game Development用户
提问于 2011-10-17 23:39:29
回答 3查看 1.6K关注 0票数 8

问题的图像参考:

(图片来源于CG教程)

D3D9 API使我们习惯了世界矩阵世界矩阵

然而,如果你使用世界矩阵,那么你必须做一个额外的矩阵乘在阴影(这最终是相同的很多顶点)。

因此,OpenGL将建模和查看矩阵连接为一个矩阵( GL_MODELVIEWMATRIX = View*World)。

什么更好,为什么?

EN

回答 3

Game Development用户

回答已采纳

发布于 2011-10-18 07:42:12

不是的。在任何时候,你都不应该有一个明确的世界矩阵在你的阴影。

详细解释为什么可以在这里找到,但短版本真的很简单:你永远不需要它,它会扼杀你的浮点精度。

如果你的世界空间太大,那么一个远离原点的相机会引起浮点精度问题。

所有的世界空间只不过是模型空间和相机空间之间的中介。这是一个你可以在同一个空间表达相机和所有其他物体的地方。但是你用它来生成一个世界对相机的矩阵,然后你应用到所有的模型到世界矩阵来创建模型到摄像机的矩阵。

您可以在C++中使用双精度而不是浮点数来处理矩阵计算中的精度问题。在上传到着色器之前,您可以将它们转换回浮动。

那么,为什么你需要在你的着色器中进行明确的世界空间变换呢?在你的源代码里是的。但在你的阴影里?你会怎么处理你不能用相机空间做的事?

照明可以在相机空间中进行,就像世界空间一样容易;你所要做的就是把你的灯光位置/方向转换成摄像机空间。毕竟,相机空间与世界空间具有相同的尺度。您每次光下每帧进行一次转换,即使在CPU上也不是一个性能负担。

因此,绝对没有必要把你的着色器暴露在一个明确的世界空间变换中。这只是一个中间的步骤,你折叠到你的矩阵。

票数 7
EN

Game Development用户

发布于 2011-10-18 19:53:21

你不会在你的着色器里做额外的矩阵乘法。诀窍是你在CPU上每帧做一次矩阵乘法,然后将最终结果上传到你的顶点着色器。这给你一个位置矩阵乘法每个顶点,无论你有世界和视图分开或串联。

票数 1
EN

Game Development用户

发布于 2011-10-17 23:54:19

在许多情况下,为了其他目的,您希望在顶点着色器中有世界pos。例如,您需要计算视图向量,以传递到像素着色器来计算镜面。

局部到世界矩阵也需要将切线向量和法线向量1转换成世界空间进行阴影处理,假设您在世界空间中进行阴影处理(您可以在切线空间中这样做,在这种情况下,您需要一组不同的矩阵)。

因此,国际海事组织,有两个矩阵是有意义的:本地到世界和世界对剪辑。后者是视图矩阵和投影矩阵的乘积。将两者传递到顶点着色器,并执行如下乘法:

代码语言:javascript
复制
posWorld = mul(posLocal, matLocalToWorld)
posClip = mul(posWorld, matWorldToClip)

1

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/18645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档