可编程管道下的剪裁平面

原创 2010年01月20日 22:22:00

作者:Bill Hsu

主页:http://www.graptor.com

剪裁平面 (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) 。根据平面方程的定义,有:


n Tp = ax + by + cz + d = 0

 

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

 

p '= R p
n' = Q n

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

 

n ' Tp' = 0
(Q n )T (R p ) = 0
n TQ TR p = 0


如果: Q TR = I

 

那么:

n TQ TR p = n TI p = n Tp = 0

于是:

Q T = 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

探索通用可编程数据平面

相比传统网络数据平面,通用可编程数据平面让网络用户可以自定义数据包的完整处理流程,实现理想的协议无关网络数据处理。作为一种理想的SDN数据平面,通用可编程数据平面还不够完善,还需要在不断的尝试中摸索前...
  • broadview2006
  • broadview2006
  • 2017年04月20日 13:36
  • 154464

OpenGL ES 学习教程(二) 可编程管线,Shader,一个彩色三角形!

顶点程序、片元程序字样,就是说,这两个过程是可编程的,要我们自己写代码去控制。 顶点程序就是常说的 顶点 Shader ,后缀一般是vsh , 片元程序 就是常说的 片段Shader,后缀一般是 ...
  • cp790621656
  • cp790621656
  • 2015年11月30日 23:55
  • 1535

OpenGL学习09_裁剪平面ClipPlane

除了视景体的6个裁剪平面(左、右、底、顶、近和远)之外,还可以另外再指定最多可达6个的其他裁剪平面,对视景体施加进一步的限制。 每个平面都是由它的方程式Ax + By + Cz + D= 0的系数所指...
  • oktears
  • oktears
  • 2015年01月20日 11:36
  • 2810

glClipPlane剪裁平面

glClipPlane裁剪平面   (2012-02-21 12:49:18) 转载▼ 标签:  半平面   裁剪   线框   球体 ...
  • u014805066
  • u014805066
  • 2016年07月15日 16:52
  • 196

图形绘制管线的学习笔记

什么是管线?管线,它用于描述一种过程,该过程可能涉及两个或者多个独特的阶段。这是摘自《OpenGL超级宝典》中的说法。         在《实时计算机图形学》一书中,将图形绘制管线分为三个主要阶段:应...
  • Haohan_Meng
  • Haohan_Meng
  • 2014年02月01日 00:34
  • 2418

Unity&Shader基础篇-可编程GPU图形绘制管线

Cg是最早的为可编程图形硬件设计的高级编程语言。它是英伟达和微软公司一起合作开发出来了语言,如果你非常熟悉C语言或者其他的编程语言,如C++、C#或者Java等,那对于Cg语言你将会非常容易掌握。Cg...
  • zhangxiao13627093203
  • zhangxiao13627093203
  • 2016年10月18日 16:58
  • 992

图形学学习笔记4——平面图形裁剪

平面图形裁剪基础概念空间中的图形尺寸任意,显示设备尺寸有限,如何判断图形哪些部分在显示区外,哪些部分在显示区内这一过程就是对图形的裁剪。当有大量图形需要显示时,裁剪就很耗时,在软件裁剪速度无法达到要求...
  • wangjing09
  • wangjing09
  • 2016年10月22日 15:56
  • 354

可编程图形渲染管线

着色程序分为两类:vertex shader program(顶点着色程序)和fragment shader program(片断着色程序)。为了清楚的解释顶点着色和片断着色的含义,我们首先从阐述GP...
  • zh13544539220
  • zh13544539220
  • 2015年07月20日 16:59
  • 2310

例子---window平台下的管道使用

1.匿名管道 (主要用于父子进程的通信) 父进程 #include #include using namespace std; int main(int argc, char *argv...
  • houkai6
  • houkai6
  • 2013年02月26日 12:02
  • 3085

现代OpenGL介绍 第一章:绘制管线

[译者注:用OpenGL很长时间了,却很少写过什么。工作中总是碰见有人问OpenGL的问题,也解决过一些OpenGL的问题,尤其是看见好多人边使用1.5版本的函数,边抱怨说OpenGL太慢了,不如D3...
  • kangsongrui
  • kangsongrui
  • 2010年04月25日 20:17
  • 6685
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可编程管道下的剪裁平面
举报原因:
原因补充:

(最多只允许输入30个字)