• <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>

            麒麟子

            ~~

            導(dǎo)航

            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            統(tǒng)計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            #

            第一次實現(xiàn)水面渲染(紋理動畫方法)

            找了很久的相關(guān)資料,關(guān)于水面渲染的還真不好找呢,突然發(fā)現(xiàn)了一個地方有介紹紋理動畫,于是就試著做了做,效果還真是不錯呢。

            只是還沒有實現(xiàn)倒影,下次再做。

            雖然大蝦很多,但像我這樣自己搗鼓的也同樣存在,那我就說說怎么實現(xiàn)的吧,也順便理清自己的思路
            我說說我的實現(xiàn)方法吧

            std::vector<IDirect3DTexture9 *> vecTexture(0); //這個就是用來存儲我們的幾十張紋理。
            先把他們?nèi)考虞d進(jìn)去。
            然后我們先畫一個矩形(略)
             
            然后我們根據(jù)下面這個來動態(tài)切換紋理
            Direct3DTexture9* Texture = NULL;
            float timeElapsed = 0;
            DWORD dwFrameSpeed = 0;
            timeElapsed += timeDelta*FrameSpeed;//timeDelta是兩次渲染的間隔時間
               if(timeElapsed>vecTexture.size()) timeElapsed = 0;
               Texture = vecTexture[(int)timeElapsed];
             
            接下來我們就可以設(shè)置紋理,然后渲染那個矩形就可以了。
            如果要使水呈透明效果,只要和地形進(jìn)行ALPHA混合就行了,混合參數(shù)自己多調(diào)兩下。

            posted @ 2009-04-22 12:26 麒麟子 閱讀(1348) | 評論 (1)編輯 收藏

            為DEMO加入霧化效果

            霧化效果

            首先來看看我們可以設(shè)置哪些參數(shù)
            1、D3DFOGSTART、D3DFOGEND表示霧的起始和結(jié)束距離
            2、D3DFOGDENSITY 霧的濃度
            3、D3DFOGCOLOR 霧的顏色
            4、D3DFOGTABLEMODE、D3DFOGVERTEXMODE 霧的模式,第一個為像素霧化,第二個為頂點霧化


            首先看看霧化的方程

            Color = f * Color(scene) + (1-f) * color(fog)

            Color(scene):背景色
            Color(fog): 霧色
            f:霧化參數(shù),隨觀察點的距離的增大而減小,從而可知最后得到的顏色,當(dāng)觀察點越遠(yuǎn)時,霧色占的比例越大。

            霧有四種方式
            D3DFOG_NONE 禁用霧化效果
            D3DFOG_EXP  霧化效果隨指數(shù)增加 f = 1/(e^density)
            D3DFOG_EXP2 同上,不過公式變?yōu)?f = 1/(e^(density^2))
            D3DFOG_LINEAR 線性霧 f = (end-d)/(end-start) d 為當(dāng)前計算點與觀察點距離

            現(xiàn)在我們來看如何實現(xiàn)霧化
            首先開啟霧化效果
            Device->SetRenderState(D3DRS_FOGENABLE,true);
            然后我們要設(shè)置霧化的模式和公式
            Device->SetRenderState(DEDRS_FOGTABLEMODE,D3DFOG_LINEAR);
            這里我將其設(shè)置成了像素霧和線性,同樣可以將其換成上面介紹的其它模式和公式
            接下來我們就要設(shè)置霧化參數(shù)了
            Device->SetRenderState(D3DRS_FOGCOLOR,oxffffffff);//設(shè)置成白色

            設(shè)置start end
            float start= 50,end = 400;
            Device->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&start);
            Device->SetRenderState(D3DRS_FOGEND,*(DWORD*)&end);
            設(shè)置濃度
            float density = 0.001f;//0.0 -- 1.0
            Device->SetRenderState(D3DRS_FOGDENSITY,*(DWORD*)&density);

            這樣,我們的設(shè)置就完了,只要將霧化設(shè)置放入我們渲染場景中,就可以看到霧化效果了.
            但應(yīng)該注意以下幾點
            -----------------------------------------line
               A          B          C
                \          |             /
                 \                     /
                   \       |         /
                    \              /
                     \    d     /
                      \        /
                       \   |  /
                        \   /
                          P
            ------------------------------------------
            霧化效果是以剛剛上面講的 d 作為計算標(biāo)準(zhǔn),所以,我們從P點看到A ,B ,C三點的霧化效果是一樣的,而按常理,A ,C的霧應(yīng)該更濃才對.
            很顯然,這讓我們想到,D3D會有對應(yīng)的處理辦法.
            D3D提供了基于發(fā)散的霧化效果,霧化隨觀察點的距離增大而增大,就像點光源,不過,這要求我們的硬件支持,所以在設(shè)置前應(yīng)該檢查
            D3DCAPS9 caps;
            Device->GetDeviceCaps(&caps);

            if(caps.RasterCaps&D3DPRASTERCAPS_FOGRANGE)
             Device->SetRenderState(D3DRS_RANGEFOGENABLE,true);

            把這個增加到霧化設(shè)置中即可~~~

            已經(jīng)12點了,估計人有點暈,也講不明白些什么東西了,到此為止

             


             

            posted @ 2009-04-20 11:58 麒麟子 閱讀(633) | 評論 (0)編輯 收藏

            透明紋理和平面陰隱DEMO


            加入了影子后的效果

            渲染樹目紋理之前,進(jìn)行如下設(shè)置
            Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
            Device->SetRenderState(D3DRS_SCRBLEND,D3DBLEND_SCRALPHA);
            Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSCRALPHA);
            Device->SetRenderState(D3DRS_ALPHATESTENABLE,true);
            Device->SetRenderState(D3DRS_ALPHAREF,0x0);
            Device->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL);


            渲染陰影的時候,使用的是同一紋理,但需進(jìn)行如下設(shè)置
            Device->SetRenderState(D3DRS_SCRBLEND,D3DBLEND_INVSCRALPHA);


            調(diào)了一下午,才調(diào)出這陰影,難得呀~~`

            posted @ 2009-04-19 14:40 麒麟子 閱讀(347) | 評論 (0)編輯 收藏

            3D DEMO的初步實現(xiàn)


            D3DMULTISAMPLE_0_SAMPLES

             


            D3DMULTISAMPLE_4_SAMPLES

            終于成功地把天空盒,公告板,MESH,紋理等一起用在了一個工程中,哈哈,雖然比較白啦,但還是很有成就感。

            posted @ 2009-04-18 15:42 麒麟子 閱讀(379) | 評論 (0)編輯 收藏

            從Xfile加載MESH模型

            首先介紹ID3DXBuffer 接口
            此類型有兩個方法
            LPVOID ID3DXBuffer::GetBufferPointer();//返回指向緩存中數(shù)據(jù)起始位置的指針
            DWORD ID3DXBuffer::GetBufferSize()//返回緩存的大小,單位為字節(jié)

            下面函數(shù)用于創(chuàng)建一個空的ID3DXBuffer對象

            HRESULT D3DXCreateBuffer(DWORD NumBytes, LPD3DBUFFER *ppBuffer);


            再來介紹一個D3DXMATRIAL結(jié)構(gòu)
            typedef struct D3DXMATERIAL
            {
                  D3DMATERIAL9 Mat3D; //存儲材質(zhì)
                  LPSTR pTextureFilename;//存儲紋理路徑名
            }D3DXMATERIAL;

            再來看看一個重要的函數(shù)
            HRESULT D3DXLoadMeshFromX(
            LPCSTR pFilename,//文件名
            DWORD Options,//創(chuàng)建網(wǎng)格時所使用的標(biāo)記
            LPDIRECT3DDEVICE9 *pDevice,
            LPD3DXBUFFER *ppAdjacency,//鄰接表信息
            LPD3DXBUFFER *ppMaterials,//材質(zhì)和紋理信息. D3DXMATRIAL結(jié)構(gòu)
            LPD3DXBUFFER *ppEffectInstances,//
            PDWORD pNumMaterials,//材質(zhì)數(shù)目
            LPD3DXMESH *ppMesh//返回填充好的Mesh對象
            };

            下面是一個實用的例子

            class MyMesh
            {
            ...........

            private:
            ID3DXMesh* Mesh = 0;
            std::vector<D3DMATERIAL9> Mtrls(0);
            std::vector<IDirect3DTexture9*> Textures(0);
            ......
            };

            bool MyMesh::LoadMyMesh( LPCSTR pName,IDirect3DDevice9* Device)
            {
               ID3DXBuffer* adjBuffer = 0;
               ID3DXBuffer* mtrlBuffer = 0;
               DWORD numMtrls = 0;
               HRESULT hr = D3DXLoadMeshFromX(pName,D3DXMESH_MANAGED,Device,&adjBuffer,&mtrlBuffer,0,&numMtrls,&Mesh);
               if(FAILED(hr))
               {
                 ::MessageBox(NULL,"D3DXLoadFromX() - FAILED",0,0);
                return false;
               }
               if(mtrlBuffer!=0&&numMtrls!=0) //如果有材質(zhì)
                { 
                    D3DXMATERIAL* mtrls  =
                    (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();//GetBufferPointer() 為了適合各種類型,因為返回VOID*類型 需要強(qiáng)制轉(zhuǎn)換
                    for(int i = 0;i<numMtrls;i++)
                    {
                      //得到的材質(zhì)沒有環(huán)境光,我們得自己加上,讓它等于漫射光
                       mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
                       Mtrls.push_back(mtrls[i].MatD3D);
                     }
                    if(mtrls[i].pTextureFilename!=0)//紋理不為空
                    IDirect3DTexture9* tex = 0;
                    D3DXCreateTextureFromFile(Device,mtrls.pTextureFilename,&tex);
                    Textures.push_back(tex);
                    }
                    else
                     {
                        Textures.push_back(0);
                     }
                 }
             adjBuffer->Release();
             mtrlBuffer->Release();
             return true;
            }

            //加載好后,設(shè)置好矩陣,就可以進(jìn)行繪制了.由于Mesh是分為許多子集的,所以要一個一個渲染
            void MyMesh::DrawMyMesh(IDreict3DDevice9* Deivice)
            {
                 for(int i =0;i<Mtrls.size();i++)
                 {
                   Device->SetMaterial(&Mtrls[i]);
                   Device->SetTexture(0,Textures[i]);
                   Mesh->DrawSubset(i);
                 }
            }

            posted @ 2009-04-18 10:02 麒麟子 閱讀(423) | 評論 (0)編輯 收藏

            僅列出標(biāo)題
            共38頁: First 24 25 26 27 28 29 30 31 32 Last 
            久久精品国产亚洲AV忘忧草18| 国产精品久久自在自线观看| 久久无码精品一区二区三区| 久久露脸国产精品| 欧美一区二区三区久久综合 | 久久久久久久国产免费看| 婷婷久久综合九色综合九七| 伊人久久无码中文字幕| A级毛片无码久久精品免费| 久久免费看黄a级毛片| 99久久久久| AV无码久久久久不卡网站下载 | 草草久久久无码国产专区| 国内精品久久久久影院亚洲| 久久精品国产免费| 亚洲香蕉网久久综合影视| 国产三级精品久久| 国产一区二区三区久久| 一级女性全黄久久生活片免费| AV狠狠色丁香婷婷综合久久| 久久精品国产久精国产果冻传媒| 久久免费美女视频| 99久久er这里只有精品18| 久久综合鬼色88久久精品综合自在自线噜噜 | 亚洲国产精品综合久久网络| 2022年国产精品久久久久| 国产69精品久久久久9999APGF | 国内精品伊人久久久久av一坑| 久久精品无码一区二区app| A狠狠久久蜜臀婷色中文网| 久久精品蜜芽亚洲国产AV| 亚洲精品国精品久久99热一 | 久久精品成人免费网站| 三上悠亚久久精品| 久久ww精品w免费人成| 99久久99久久| 亚洲伊人久久大香线蕉苏妲己| 精品精品国产自在久久高清| 2021少妇久久久久久久久久| 久久精品这里热有精品| 久久www免费人成精品香蕉|