首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

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

2013-04-21 
计算视图投影空间的位置在程序中和在shader中有什么区别?首先,我不知道标题那样表达对不对:毕竟是在屏幕上

计算视图投影空间的位置在程序中和在shader中有什么区别?
首先,我不知道标题那样表达对不对:毕竟是在屏幕上看效果。

在应用程序中我是这么算的:
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中一致的结果呢?

谢谢各位指点!

[解决办法]

引用:
引用:回去翻计算机图形学吧,先明白3D物体定点是怎么转到2D空间去再回来看。
楼上的回复可用于任何一帖。谢谢你?

我只能说,算法写在代码里还是shader里是没有任何区别的。
至于出现问题,那肯定是你哪些细节搞错了。
如果三言两语可以帮你,我自然会说。
这就涉及到细节沟通的问题了。
其一,你的表达,我还不是很理解你的问题在哪。
其二,我看不到更多的细节,无法给你解答。
起码在你的描述中,我的结论是你的理论基础不足。所以我建议你再温习一下细节。
我能想到的提示是:
对于shader来说应该是
OutVec = mul( WorldPos ,ViewProjectMatrix );
当你把OutVec 返回给GPU的时候,GPU会进一步操作
OutVec = OutVec / OutVec.w;
然后OutVec的x,y才会被转到(-1,1)这个区间,如果不在这个区间里,说明这个顶点在屏幕这外。
[解决办法]
是不是你的矩阵的行列不对的原因

参考:http://www.94df.com/a/jishuwenzhang/2013/0219/5475.html

热点排行