计算视图投影空间的位置在程序中和在shader中有什么区别?

千分散尽还复来 2013-04-13 07:00:01
首先,我不知道标题那样表达对不对:毕竟是在屏幕上看效果。

在应用程序中我是这么算的:
D3DXVECTOR3 OutVec ;//希望输出的矢量
D3DXVECTOR3 WorldPos ;//在世界空间中的一个点的位置
D3DXMATRIX ViewProjectMatrix = CamViewMatrix * CamProjectMatrix;//视图和投影矩阵相乘
D3DXVec3TransformCoord( &OutVec , &WorldPos , &ViewProjectMatrix ) ;

把WorldPos传入shader后就这样了:
OutVec = mul( WorldPos ,ViewProjectMatrix ).xyz ;

我验证了下两种算法下的Z值就有很大差别。
网上找了两段话:“投影矩阵(Project Matrix)本意是将不规则的视图体(View Volume)变换成一个单位立方体,但投射到屏幕时,Z被丢弃了”
“投影矩阵前的顶点w总是为1, 正射投影矩阵后的顶点w还是为1, 但透视投影矩阵后的顶点w开始不为1”

我用的就是透视投影相机,但D3DXVec3TransformCoord()函数已经把OutVec的w分量置为1了,为什么还不一样呢?
shader中的mul()函数又是怎样计算的,我还不清楚。

如果在应用程序中计算,怎样才能得到与shader中一致的结果呢?

谢谢各位指点!
...全文
148 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
哥不是菜鸟么?哥不是没那么多时间去从头学习么?要不还在这儿丢人现眼?
引用 3 楼 liuxingzdh 的回复:
对于shader来说应该是 OutVec = mul( WorldPos ,ViewProjectMatrix ); 当你把OutVec 返回给GPU的时候,GPU会进一步操作 OutVec = OutVec / OutVec.w; 然后OutVec的x,y才会被转到(-1,1)这个区间,如果不在这个区间里,说明这个顶点在屏幕这外。
这一段我还知道一点;而且帮助文档中说“D3DXVec3TransformCoord( D3DXVECTOR3 * pOut, CONST D3DXVECTOR3 * pV, CONST D3DXMATRIX * pM ); This function transforms the vector, pV (x, y, z, 1), by the matrix, pM, projecting the result back into w=1.” 所以我觉得在程序中和在shader中的计算结果应该一样,但事实上结果并不相同。我想知道在程序中怎样算才能得到与shader中一样的结果。 不管怎么说,我得感谢你的回复!
寻开心 2013-04-17
  • 打赏
  • 举报
回复
是不是你的矩阵的行列不对的原因 参考:http://www.94df.com/a/jishuwenzhang/2013/0219/5475.html
芳草天 2013-04-16
  • 打赏
  • 举报
回复
引用 2 楼 Renyq 的回复:
引用 1 楼 liuxingzdh 的回复:回去翻计算机图形学吧,先明白3D物体定点是怎么转到2D空间去再回来看。 楼上的回复可用于任何一帖。谢谢你?
我只能说,算法写在代码里还是shader里是没有任何区别的。 至于出现问题,那肯定是你哪些细节搞错了。 如果三言两语可以帮你,我自然会说。 这就涉及到细节沟通的问题了。 其一,你的表达,我还不是很理解你的问题在哪。 其二,我看不到更多的细节,无法给你解答。 起码在你的描述中,我的结论是你的理论基础不足。所以我建议你再温习一下细节。 我能想到的提示是: 对于shader来说应该是 OutVec = mul( WorldPos ,ViewProjectMatrix ); 当你把OutVec 返回给GPU的时候,GPU会进一步操作 OutVec = OutVec / OutVec.w; 然后OutVec的x,y才会被转到(-1,1)这个区间,如果不在这个区间里,说明这个顶点在屏幕这外。
  • 打赏
  • 举报
回复
引用 1 楼 liuxingzdh 的回复:
回去翻计算机图形学吧,先明白3D物体定点是怎么转到2D空间去再回来看。
楼上的回复可用于任何一帖。谢谢你?
芳草天 2013-04-14
  • 打赏
  • 举报
回复
回去翻计算机图形学吧,先明白3D物体定点是怎么转到2D空间去再回来看。

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧