公告

联系我:我的126邮箱: billhsu。 Locations of visitors to this page
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

  • 随笔 - 41
  • 文章 - 0
  • 评论 - 82
  • 引用 - 0

常用链接

留言簿(16)

随笔分类

随笔档案

相册

Game Dev

搜索

  •  

最新评论

阅读排行榜

评论排行榜

可编程管道下的剪裁平面

剪裁平面 (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( &clipplane, &vPosition, &vNormal ); // 生成剪裁平面

m_pDevice()->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),设平面上有个点p:(x,y,z,1)。根据平面方程的定义,有:


nTp = ax + by + cz + d = 0

设矩阵R可以让点P从世界坐标系转换到剪裁坐标系,矩阵Q可以让平面n实现同样的变换。那么,有:

p'= Rp
n'= Qn

其中p'n'分别是转换后的点与平面。


n'Tp'= 0
(Qn)T (Rp) = 0
nTQTRp = 0


如果:QTR = I

那么:

nTQTRp = nTIp = nTp = 0

于是:

QT = R-1
Q
= (R-1)T

DirectX 3D中,将一个点从世界坐标系转换到剪裁坐标系,所用的矩阵为观察矩阵与投影矩阵的乘积,即:

D3DXMATRIX  TranMatrix = matView*matProj;

(TranMatrix为所求的变换矩阵,matViewmatProj分别为观察矩阵与投影矩阵)

 

附上在D3D中变换的完整代码:

D3DXPLANE tempPlane = clipplane;
D3DXPlaneNormalize(&tempPlane, &tempPlane);

D3DXMATRIX  TranMatrix = matView*matProj;
D3DXMatrixInverse(&TranMatrix, NULL, &TranMatrix);
D3DXMatrixTranspose(&TranMatrix, &TranMatrix);
D3DXPlaneTransform(&tempPlane, &tempPlane, &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

posted on 2010-01-20 22:00 Bill Hsu 阅读(1913) 评论(2)  编辑 收藏 引用 所属分类: C/C++Game DevAlgorithm

评论

# re: 可编程管道下的剪裁平面 2010-06-12 08:38 小时候可靓了

嗯,你的比他的说得详细!
  回复  更多评论    

# re: 可编程管道下的剪裁平面 2010-06-12 16:55 Bill Hsu

@小时候可靓了
:-)
  回复  更多评论    

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理