zoukankan      html  css  js  c++  java
  • (转)可编程管道下的剪裁*面

    低手交流,高手勿入

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

    m_pDevice()->SetClipPlane( 0, (float*)clipplane); 

     

    然而,在现在的可编程管道(programmable pipeline)下,设置的剪裁*面会被在剪裁坐标系下处理,而不是在世界坐标系下。
    解决这个问题的方法有:

    1)  给要剪裁的顶点做标记,在Pixel Shader中把它剪裁掉。

    2)  使用*斜*面裁剪(Oblique Near-Plane Clipping),即修改投影矩阵,将要剪裁的顶点放在视截体之外,从而[来源:GameRes.com]避免了该顶点的绘制。

    3)  修改*面方程,使之从世界坐标系转换到剪裁坐标系。


    上述方法中,第一种和第二种效率并不高:在Pixel Shader中剪裁没有减少任何不必要的顶点处理,而计算*斜*面裁剪矩阵较为繁琐。所以,方法三是最佳选择。

      要将一个*面从世界坐标系转换到剪裁坐标系,必须求出这个变换矩阵。

    设*面方程ax+by+cz+d=0,用一个4维向量来n表示(a,b,c,d),设*面上有个点p:(x,y,z,1)。根据*面方程的定义,有:


    nT p = ax + by + cz + d = 0

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

    p’= R p
    n’= Q n

    其中p’、n’分别是转换后的点与*面。

    n’T 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中,将一个点从世界坐标系转换到剪裁坐标系,所用的矩阵为观察矩阵与投影矩阵的乘积,即:

    D3DXMATRIX  TranMatrix = matView*matProj;

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

     

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

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

    D3DXMATRIX  TranMatrix = matView*matProj;
    D3DXMatrixInverse(&TranMatrix, NULL, &TranMatrix);
    D3DXMatrixTranspose(&TranMatrix, &TranMatrix);
    D3DXPlaneTransform(&tempPlane, &tempPlane, &TranMatrix);
  • 相关阅读:
    Java 垃圾回收
    位运算符
    VBA中练习ADO:ActiveX Data Object
    使用VB6制作RTD函数
    VBA中使用JavaScript脚本语言解析JSON数据
    VB洗牌算法产生随机数组
    关于VB里判断逻辑的说明
    在VB中动态执行VBS代码,可操控窗体控件
    VB使用API进行RC4加密解密(MD5密钥)
    VB输出数据到EXCEL
  • 原文地址:https://www.cnblogs.com/lancidie/p/1847655.html
Copyright © 2011-2022 走看看