• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            D3DFVF淺談------ D3DFVF_XYZ 和 D3DFVF_XYZRHW 的區別

            轉載自:http://hi.baidu.com/lovebirds/blog/item/33d450af4a2f19f3fbed509b.html


            D3DFVF淺談

            有些新手不知道什么是D3DFVF ,這里做個簡單介紹,和一些應用。但關于D3DFVF 最官方的資料還是看SDK(但它是英文的)。

            D3DFVF_XYZ——頂點的三維坐標,表示有位置,而且會又Direct3D進行矩陣變換;
            D3DFVF_XYZRHW——即平時所說rhw,它說明頂點有位置,而且經過了矩陣變換,不用在由Direct3D對它進行變換,通常用于做UI(用戶界面);
            D3DFVF_DIFFUSE——表示頂點格式中有漫反射顏色;
            D3DFVF_NORMAL——表示頂點有法線向量;
            D3DFVF_TEX^——表示頂點有紋理坐標,^可以是1至8,表示有多少套紋理坐標;

            以上是最常用的D3DFVF了,如果還要更詳細,請看SDK(一半以上的夠用了)。

            還有一些應用方法:
            1、在創建VB時,pd3dDevice->CreateVertexBuffer(3*sizeof(Vertex),D3DUSAGE_WRITEONLE,FVF,D3DPOOL_MANAGED,&先前聲明的VB,NULL);
            在此之前還要先定義FVF:
            #define FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)//這里隨自己需要
            還要定義自己的頂點結構,這個FVF,頂點結構可以這樣:
            struct Vertex
            {
            float x,y,z;//對應D3DFVF_XYZ
            DWORD diffuse;//對應D3DFVF_DIFFUSE
            };

            2、我們很多時候要用到ID3DXMesh,但它的頂點用矩陣變換還不夠,不能滿足骨骼動畫的需求,所以只能用Vertex Shader和ID3DXMesh::LockVertexBuffer()了,這里重點說LockVertexBuffer()。
            首先,我們不知到Mesh的格式,如果貿然用LockVertexBuffer()會出錯,所以先統一Mesh的頂點格式:
            ID3DXMesh Mesh;
            ..........
            Mesh->CloneMeshFVF (D3DXMESH_MANAGED,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DXFVF_TEX1),pdev,&Mesh);
            重新定義結構Vertex:
            struct Vertex
            {
            float x,y,z;//對應D3DFVF_XYZ
            float nx,ny,nz;//對應D3DFVF_NORMAL
            DWORD diffuse;//對應D3DFVF_DIFFUSE
            float u,v;//對應D3DFVF_TEX1
            };
            之后就可以Lock了:
            Vertex *v;
            int numV=Mesh->GetNumVertices();//Mesh的頂點數量
            Mesh->LockVertexBuffer(NULL,(void**)&v);
            for(int i=0;i<count;i++)
            {
            v[i].x+=5;//這里就是實現,可以任意把v[i]的數據調整
            }
            Mesh->UnlockVertexBuffer();//解Lock

            http://bbs.gameres.com/showthread.asp?threadid=29618

            D3DFVF_XYZ 和 D3DFVF_XYZRHW 的區別

            學習D3D9的時候遇到靈活頂點格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之間差異而引起的問題。
            參看了同是C++博客的一篇博文,其分析如下:
            在頂點結構體中沒有RHW時,Direct3D將執行視、投影、世界等變換以及進行光線計算,之后你才能在窗口中得到你所繪制的物體。當頂點結構體中有RHW時,就像上面那段英文所述,告知Direct3D使用的頂點已經在屏幕坐標系中了,不再執行視圖、投影、世界等變換和光線計算,因為D3DFVF_XYZRHW標志告訴它頂點已經經過了這些處理,并直接將頂點進行光柵操作,任何用SetTransform進行的轉換都對其無效。不過這時的原點就在客戶區的左上角了,其中x向右為正,y向下為正,而z的意義已經變為z-buffer的象素深度。
            值得注意的是D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能共存,因為后兩個標志與前一個矛盾。在使用這種頂點時,系統需要頂點的位置已經經過變換了,也就是說x、y必須在屏幕坐標系中,z必須是z-buffer中的象素深度,取值范圍:0.0-1.0,離觀察者最近的地方為0.0,觀察范圍內最遠可見的地方為1.0。
            ---------------------------------------------------------------------------------------------------------------------------------------------------------------
            結合我自己的試驗,有一些發現,記錄下來以備忘。
            D3DFVF_XYZ默認的用戶區中心坐標是(0,0),而D3DFVF_XYZRHW是左上角為(0,0)
            用D3DFVF_XYZ默認的為非光照的,而D3DFVF_XYZRHW是高洛德光照。
            當使用D3DFVF_XYZ時,要設置渲染狀態:

            g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE)

            而且要設置觀察矩陣和投影矩陣,例如:

            D3DXMATRIX matProj;
            D3DXMATRIX matView;

            // Create and set the projection matrix

            D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4.0f, 1.33333f, 1.0f, 1000.0f);
            g_pd3dDevice
            ->SetTransform(D3DTS_PROJECTION, &
            matProj);

            // Create and set the view matrix

            D3DXMatrixLookAtLH(&matView, \
            &D3DXVECTOR3(0.0f, 0.0f, -500.0f
            ), \
            &D3DXVECTOR3(0.0f, 0.0f, 0.0f
            ), \
            &D3DXVECTOR3(0.0f, 1.0f, 0.0f
            ));
            g_pd3dDevice
            ->SetTransform(D3DTS_VIEW, &matView);

            否則沒有渲染結果。

            另外一個帖子:http://bbs.gameres.com/showthread.asp?threadid=121111

            Re:D3DFVF_XYZRHW 中的W跟Z分別表示什么

            D3DFVF_XYZRHW的格式是(x,y,z,1/w),RHW是指W的倒數。

            使用這個格式的頂點是不通過頂點變換的,也就是直接對應窗口設備坐標系,這個坐標系下Z的范圍是[0,1]

            (x,y,z)的形式是仿射坐標,(x,y,z,w)的形式是齊次坐標,詳細的可以去看數學參考書。在這里由于已經是設備坐標系了,所以一般情況下w只用1.0。但如果是自己做的三維空間變換得到的坐標,那么w就很重要,因為它要用于紋理的透視矯正。

            最后一個帖子:http://hi.baidu.com/microsoftxiao/blog/item/4108ce58fab4ed87800a18f8.html

            D3DFVF_XYZ D3DFVF_XYZRHW區別

            D3DFVF_XYZ - 頂點格式包括未變換的頂點位置。這個標記不能和D3DFVF_XYZRHW一起使用。
            D3DFVF_XYZRHW - 頂點格式包括變換后的頂點位置。這個標記不能和D3DFVF_XYZ或D3DFVF_NORMAL
            一起使用。
            [注意] 使用D3DFVF_XYZRHW時,RHW分量應設置為>=1.0f,只有這樣才表明該頂點為變換后的。

            一定要了解DirectX SDK里DX90SDK\Samples\C++\Direct3D\Tutorials\Tut02_Vertices下的例子,
            了解到D3DFVF_XYZ D3DFVF_XYZRHW的區別。




            posted on 2010-11-20 23:58 楊粼波 閱讀(1106) 評論(0)  編輯 收藏 引用

            亚洲精品97久久中文字幕无码| 一本一本久久a久久综合精品蜜桃| 久久久国产视频| 中文国产成人精品久久不卡| 亚洲精品乱码久久久久久蜜桃图片| 久久超乳爆乳中文字幕| 91精品国产综合久久香蕉| 久久精品成人一区二区三区| 欧美精品福利视频一区二区三区久久久精品| 天堂无码久久综合东京热| 日韩乱码人妻无码中文字幕久久 | 人妻无码αv中文字幕久久| 久久精品中文闷骚内射| 久久综合色区| 精品国产一区二区三区久久| 麻豆精品久久久久久久99蜜桃| 99久久国产综合精品五月天喷水 | 久久久精品视频免费观看| 无码乱码观看精品久久| 久久精品国内一区二区三区 | 久久天天日天天操综合伊人av| 中文无码久久精品| 久久久久久久久久久免费精品| 久久精品无码一区二区无码| 国产精品久久久久蜜芽| 久久精品国产精品亚洲| 女人香蕉久久**毛片精品| 亚洲中文字幕无码久久精品1| 久久伊人中文无码| 久久精品国产清自在天天线| 久久精品国产半推半就| 潮喷大喷水系列无码久久精品| 无码任你躁久久久久久老妇App| 久久精品国产99久久丝袜| 很黄很污的网站久久mimi色| 91久久精品视频| 国产免费久久精品99久久| 久久国产V一级毛多内射| 狠狠色综合网站久久久久久久| 久久亚洲国产午夜精品理论片| 秋霞久久国产精品电影院|