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

            永遠(yuǎn)也不完美的程序

            不斷學(xué)習(xí),不斷實(shí)踐,不斷的重構(gòu)……

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            好友鏈接

            最新評(píng)論

            用DirectX寫(xiě)的Skybox

                    實(shí)現(xiàn)原理:設(shè)置5個(gè)面,即前、后、左、右、上5個(gè),每個(gè)面4個(gè)頂點(diǎn),共20個(gè)頂點(diǎn),然后對(duì)每個(gè)面貼圖,行走時(shí),skybox與行走做相同的操作。下面一步步實(shí)現(xiàn):
            首先給出skybox的定義:
            class CSkybox
            {
            //
            //以下是基礎(chǔ)數(shù)據(jù)
            private:
                D3DXMATRIXA16 m_matWorld;     
            //世界矩陣 

                LPDIRECT3DTEXTURE9      m_pSideTexture[
            6];   //skybox的6個(gè)面的紋理
                D3DXVECTOR3             m_vSize;  
            // z, x, y分別為長(zhǎng),寬,高
                D3DXVECTOR3             m_vPos;   
            // skybox的中心點(diǎn)
                D3DXVECTOR3             m_vPosOrgin;   
            //原始點(diǎn)
            }

                    1、設(shè)置skybox的大小和位置,即設(shè)置盒子的長(zhǎng)寬高。
            //設(shè)置位置
            void  SetBoxPos(
            const D3DXVECTOR3& vPos)
            {
                m_vPos 
            = vPos;          //當(dāng)前點(diǎn)
                m_vPosOrgin 
            = m_vPos;   //原始點(diǎn)
            }

            void SetBoxSize(
            const D3DXVECTOR3& vSize)
            {
                m_vSize 
            = vSize;
            }

                    2、創(chuàng)建頂點(diǎn)緩沖,頂點(diǎn)的位置要根據(jù)第一步的盒子大小創(chuàng)建。
            實(shí)際上我只用了兩張紋理,從CG模型網(wǎng)下載的古墓麗影的天空盒紋理,所以創(chuàng)建紋理坐標(biāo)時(shí)是0.5。
            BOOL CSkyBox::CreateVertexBuffer(LPDIRECT3DDEVICE9 p3DDevice9)
            {
                float fWidth 
            = m_vSize.x;
                float fLength 
            = m_vSize.z;
                float fHeight 
            = m_vSize.y;

                
            //確定8個(gè)點(diǎn)
                
            //上面的左上角
                D3DXVECTOR3 vTTopLeft(m_vPos.x 
            - fWidth / 2, m_vPos.y + fHeight / 2, fLength / 2 - m_vPos.z);
                D3DXVECTOR3 vTTopRight(fWidth 
            / 2 - m_vPos.x, m_vPos.y + fHeight / 2, fLength / 2 - m_vPos.z);
                D3DXVECTOR3 vTBottomLeft(m_vPos.x 
            - fWidth / 2, m_vPos.y + fHeight / 2, m_vPos.z - fLength / 2);
                D3DXVECTOR3 vTBottomRight(fWidth 
            / 2 - m_vPos.x, m_vPos.y + fHeight / 2, m_vPos.z - fLength / 2);

                
            //下面
                D3DXVECTOR3 vBTopLeft(m_vPos.x 
            - fWidth / 2, m_vPos.y - fHeight / 2, fLength / 2 - m_vPos.z);
                D3DXVECTOR3 vBTopRight(fWidth 
            / 2 - m_vPos.x, m_vPos.y - fHeight / 2, fLength / 2 - m_vPos.z);
                D3DXVECTOR3 vBBottomLeft(m_vPos.x 
            - fWidth / 2, m_vPos.y - fHeight / 2, m_vPos.z - fLength / 2);
                D3DXVECTOR3 vBBottomRight(fWidth 
            / 2 - m_vPos.x, m_vPos.y - fHeight / 2, m_vPos.z - fLength / 2);

                CUSTOMVERTEX_TXT cvVertices[] 
            =
                {
                    
            //上面的點(diǎn)
                    {vTBottomLeft, D3DCOLOR_XRGB(
            25500), 0.0f, 0.0f,}, //Vertex 2 - Red
                    {vTBottomRight, D3DCOLOR_XRGB(
            2552550), 1.0f, 0.0f,}, //Vertex 3 - Green
                    {vTTopLeft, D3DCOLOR_XRGB(
            255255255), 0.0f, 1.0f,}, //Vertex 1 - Red 
                    {vTTopRight, D3DCOLOR_XRGB(
            255255255), 1.0f, 1.0f,}, //Vertex 0 - Blue 

                    
            //前面
                    {vTTopLeft, D3DCOLOR_XRGB(
            255255255), 0.0f, 0.0f,}, //Vertex 0 - Blue 
                    {vTTopRight, D3DCOLOR_XRGB(
            255255255), 0.5f, 0.0f,}, //Vertex 1 - Red 
                    {vBTopLeft, D3DCOLOR_XRGB(
            255255255), 0.0f, 1.0f,}, //Vertex 2 - Red 
                    {vBTopRight, D3DCOLOR_XRGB(
            255255255), 0.5f, 1.0f,}, //Vertex 3 - Green 

                    
            //右面
                    {vTTopRight, D3DCOLOR_XRGB(
            255255255), 0.5f, 0.0f,}, //Vertex 0 - Blue
                    {vTBottomRight, D3DCOLOR_XRGB(
            02550), 1.0f, 0.0f,}, //Vertex 3 - Green
                    {vBTopRight, D3DCOLOR_XRGB(
            25500), 0.5f, 1.0f,}, //Vertex 2 - Red 
                    {vBBottomRight, D3DCOLOR_XRGB(
            255255255), 1.0f, 1.0f,}, //Vertex 1 - Red 


                    
            //后面
                    {vTBottomRight, D3DCOLOR_XRGB(
            255255255), 0.0f, 0.0f,}, //Vertex 0 - Blue
                    {vTBottomLeft, D3DCOLOR_XRGB(
            255255255), 0.5f, 0.0f,}, //Vertex 0 - Blue
                    {vBBottomRight, D3DCOLOR_XRGB(
            255255255), 0.0f, 1.0f,}, //Vertex 1 - Red 
                    {vBBottomLeft, D3DCOLOR_XRGB(
            255255255), 0.5f, 1.0f,}, //Vertex 1 - Red 

                    
            //左面
                    {vTBottomLeft, D3DCOLOR_XRGB(
            255255255), 0.5f, 0.0f,}, //Vertex 0 - Blue 
                    {vTTopLeft, D3DCOLOR_XRGB(
            255255255), 1.0f, 0.0f,}, //Vertex 0 - Blue 
                    {vBBottomLeft, D3DCOLOR_XRGB(
            255255255), 0.5f, 1.0f,}, //Vertex 1 - Red 
                    {vBTopLeft, D3DCOLOR_XRGB(
            255255255), 1.0f, 1.0f,}, //Vertex 1 - Red


                
            if(FAILED(p3DDevice9->CreateVertexBuffer(20 * sizeof(CUSTOMVERTEX_TXT),
                    
            0, D3DFVF_CUSTOMVERTEX,
                    D3DPOOL_DEFAULT, 
            &m_pVertexBuffer, NULL)))
                {
                    return 
            FALSE;
                }

                VOID
            * pVertices = NULL;

                
            if(FAILED(m_pVertexBuffer->Lock(0, sizeof(cvVertices), (void**)&pVertices, 0)))
                {
                    return 
            FALSE;
                }

                
            //Copy our stored vertices values into the vertex buffer
                memcpy(pVertices, cvVertices, sizeof(cvVertices));

                
            //Unlock the vertex buffer
                m_pVertexBuffer
            ->Unlock();

                return 
            TRUE;
            }

                    3、創(chuàng)建每個(gè)面的紋理。
                    4、更新世界矩陣。根據(jù)攝像頭位置的改變,改變skybox的世界矩陣就行了。
            void CSkyBox::UpdatePos(const D3DXVECTOR3& vPos)
            {
                m_vPos 
            = vPos;
                D3DXVECTOR3 v 
            = m_vPos - m_vPosOrgin;    //計(jì)算出平移的向量
                m_matWorld._41 
            = v.x;
                m_matWorld._42 
            = v.y;
                m_matWorld._43 
            = v.z;
            }

            posted on 2008-03-24 09:27 狂爛球 閱讀(1673) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 圖形編程

            評(píng)論

            # re: 用DirectX寫(xiě)的Skybox 2015-03-13 15:10 祛痘辦法有哪些

            {vTBottomLeft, D3DCOLOR_XRGB(255, 255, 255), 0.5f, 0.0f,}, //Vertex 0 - Blue
            {vTTopLeft, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f,}, //Vertex 0 - Blue
            {vBBottomLeft, D3DCOLOR_XRGB(255, 255, 255), 0.5f, 1.0f,}, //Vertex 1 - Red
            {vBTopLeft, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f,}, //Vertex 1 - Red  回復(fù)  更多評(píng)論   

            精品久久久无码中文字幕天天| 综合人妻久久一区二区精品| 国产精品伦理久久久久久| 久久夜色tv网站| 日本精品久久久久影院日本| 伊人久久精品无码二区麻豆| 97热久久免费频精品99| 久久伊人精品青青草原日本| 亚洲国产另类久久久精品黑人| 中文字幕亚洲综合久久2| 久久这里只有精品视频99| 久久精品国产亚洲AV无码麻豆 | 日本精品久久久久中文字幕8| 久久国产三级无码一区二区 | 日韩一区二区久久久久久| 一级a性色生活片久久无| 精品久久久久久亚洲精品 | 午夜精品久久久久久久无码| 久久精品国产网红主播| 久久无码一区二区三区少妇 | 久久国产精品免费一区| 久久精品国产第一区二区三区| 一本一道久久a久久精品综合| 色综合久久综合网观看| 69国产成人综合久久精品| 人妻无码久久精品| 亚洲中文字幕无码久久精品1| 国产精品美女久久久网AV| 久久精品国产亚洲AV大全| 久久频这里精品99香蕉久| 国产精品gz久久久| 国产巨作麻豆欧美亚洲综合久久| 国产精品久久久久国产A级| 亚洲狠狠婷婷综合久久久久| 久久精品人人做人人爽电影| 久久精品免费一区二区| 久久人人爽人人爽人人片AV高清 | Xx性欧美肥妇精品久久久久久| 99国产欧美久久久精品蜜芽| 久久精品国产亚洲综合色| 亚洲狠狠综合久久|