低手交流,高手勿入
作者:Bill Hsu
主页:http://www.graptor.com
GameRes发帖里的公式什么的可能不太整齐,
在这里看可能效果好一点~
http://hi.baidu.com/probill/blog/item/32111f1ccbc2cd8086d6b6f1.html
剪裁平面(Clip Plane)在图形学领域有着重要的作用,比如水面模拟中,渲染折射纹理时,我们就必须将水面以上的顶点通过剪裁平面剪裁掉。
在过去的固定渲染管道时代,剪裁平面的实现较为简单,比如在DirectX 9中,可以先设定剪裁平面在世界坐标系下的方程(ax+by+cz+d=0),再调用SetClipPlane(DWORD Index,CONST float * pPlane)这个API函数就可以了。
附上例子程序:
vPosition=D3DXVECTOR3(0,0,0);//平面上一个点
vNormal=D3DXVECTOR3(0,1,0);//法向量
D3DXPlaneFromPointNormal( amp;clipplane, amp;vPosition, amp;vNormal );//生成剪裁平面
m_pDevice()-gt;SetClipPlane( 0, (float*)clipplane);
然而,在现在的可编程管道(programmable pipeline)下,设置的剪裁平面会被在剪裁坐标系下处理,而不是在世界坐标系下。
解决这个问题的方法有:
1)给要剪裁的顶点做标记,在Pixel Shader中把它剪裁掉。
2)使用近斜平面裁剪(Oblique Near-Plane Clipping),即修改投影矩阵,将要剪裁的顶点放在视截体之外,从而避免了该顶点的绘制。
3)修改平面方程,使之从世界坐标系转换到剪裁坐标系。
上述方法中,第一种和第二种效率并不高:在Pixel Shader中剪裁没有减少任何不必要的顶点处理,而计算近斜平面裁剪矩阵较为繁琐。所以,方法三是最佳选择。
要将一个平面从世界坐标系转换到剪裁坐标系,必须求出这个变换矩阵。
设平面方程ax+by+cz+d=0,用一个4维向量来n表示(a,b,c,d),设平面上有个点px,y,z,1)。根据平面方程的定义,有:
nT p = ax + by + cz + d = 0
设矩阵R可以让点P从世界坐标系转换到剪裁坐标系,矩阵Q可以让平面n实现同样的变换。那么,有:
p= R p
n= Q n
其中p、n分别是转换后的点与平面。
nT p= 0
(Q n)T (R p) = 0
nT QT R p = 0
如果:QT R = I
那么:
nT QT R p = nT I p = nT p = 0
于是:
QT = R-1
Q = (R-1)T
在DirectX 3D中,将一个点从世界坐标系转换到剪裁坐标系,所用的矩阵为观察矩阵与投影矩阵的乘积,即:
D3DXMATRIXTranMatrix = matView*matProj;
(TranMatrix为所求的变换矩阵,matView和matProj分别为观察矩阵与投影矩阵)
附上在D3D中变换的完整代码:
D3DXPLANE tempPlane = clipplane;
D3DXPlaneNormalize(amp;tempPlane, amp;tempPlane);
D3DXMATRIXTranMatrix = matView*matProj;
D3DXMatrixInverse(amp;TranMatrix, NULL, amp;TranMatrix);
D3DXMatrixTranspose(amp;TranMatrix, amp;TranMatrix);
D3DXPlaneTransform(amp;tempPlane, amp;tempPlane, amp;TranMatrix);
参考资料:
1.Back Face Culling Notes ,Jordan Smith (University of California, Berkeley)
http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/backfacecull.shtml
2.GameDev Forum
http://www.gamedev.net/community/forums/topic.asp?topic_id=402381
3.Oblique Near-Plane Clipping with Orthographic Camera ,Aras
http://aras-p.info/texts/obliqueortho.html
锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛
- 还没有人评论,欢迎说说您的想法!