• <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āng)自強(qiáng)而不息

            D3D中的地形繪制基礎(chǔ)(3)

            13

            13.4光照

            cTerrain::generate_texture方法會(huì)調(diào)用cTerrain::light_terrain,顧名思義,光照使地形更接近于現(xiàn)實(shí)。當(dāng)我們已經(jīng)計(jì)算完地形紋理以后,我們只需要計(jì)算陰影系數(shù)(shade factor),使一個(gè)定義了光源的地形區(qū)域變亮或變暗。你會(huì)驚訝于為什么我們照亮地圖卻沒(méi)有讓Direct3D來(lái)做。我們自己來(lái)計(jì)算有三個(gè)好處:

            內(nèi)存中不必保存頂點(diǎn)法線(xiàn)。

            因?yàn)榧y理是靜態(tài)的,所以不能隨意的移動(dòng)光源。雖然我們可以重新計(jì)算光源,但因此采用Direct3D實(shí)時(shí)的照亮地形是很耗時(shí)的。

            我們獲得了一些數(shù)學(xué)上的經(jīng)驗(yàn),熟悉了一些基本的光照概念,并且是用Direct3D函數(shù)實(shí)踐的。

            13.4.1概覽(OVERVIEW)

            光照是計(jì)算地形陰影shade)的一個(gè)最基本的技巧之一,一般認(rèn)為的光是漫射光(diffuse lighting),給定一個(gè)平行光源,我們用“到達(dá)光源的方向(direction to light)”(該光源發(fā)出的平行光的傳播方向的反方向)。因此,如果我們想讓光線(xiàn)從空中筆直落下,那么lightRaysDirection = (0, -1, 0),按相反的方向:directionToLight = (0, 1, 0)注意:創(chuàng)建光照向量要使用單位向量。

            注意:雖然指定方向的光是從光源發(fā)射出來(lái)的,這么說(shuō)更直接一點(diǎn),指定到達(dá)光源的反向在計(jì)算上要比漫謝光更合得來(lái)。

            對(duì)于地形中的每個(gè)方格,我們計(jì)算光的向量與方格的面法線(xiàn)之間的角度。

            在圖13.7中我們看到,當(dāng)角度變得比較大時(shí),方格的面離光源越來(lái)越遠(yuǎn),接收的光越少。反過(guò)來(lái)說(shuō),角度變小,方格的面則離光源越來(lái)越近,相應(yīng)的會(huì)接收更多的光。注意:一旦光向量與法線(xiàn)角度大于90度,表面就接收不到光。

            我們能夠創(chuàng)建一個(gè)陰影shading)標(biāo)量,用0..1之間的范圍來(lái)表示表面能接收到光的多少。使用陰影標(biāo)量,角度大則標(biāo)量接近于0。當(dāng)顏色與一個(gè)陰影標(biāo)量接近0的值相乘時(shí),得到的結(jié)果是:顏色變暗。相反,乘以一個(gè)陰影標(biāo)量的值接近1的值時(shí),顏色則接近于原始亮度。

             

            13.4.2 計(jì)算方格的陰影(Shade

            光源的方向是一個(gè)單位向量,為了計(jì)算光源方向與面法線(xiàn)間的夾角,首先需要找到面法線(xiàn),這是叉積的一小部分應(yīng)用,但首先必須在方格里找到二個(gè)共面的非0并且不平行的向量。看圖 13.8有兩個(gè)這樣的向量:

             

            給指定的格子計(jì)算陰影系數(shù)用cTerrain::compute_shade方法,它需要參數(shù):行和列來(lái)確定方格,還有平行方向光的光源。

                float cTerrain::compute_shade(int cell_row, int cell_col, D3DXVECTOR3* dir_to_light)
                {
                    
            // get heights of three vertices on the quad
               
                float height_a = get_height_map_entry(cell_row,   cell_col);
                    
            float height_b = get_height_map_entry(cell_row,   cell_col+1);
                    
            float height_c = get_height_map_entry(cell_row+1, cell_col);
               
                    
            // build two vectors on the quad
               
                    D3DXVECTOR3 u(m_cell_spacing, height_b - height_a, 0.0f);
                    D3DXVECTOR3 v(0.0f,              height_c - height_a, -m_cell_spacing);
               
                    
            // find the normal by taking the cross product of two vectors on the quad
               
                D3DXVECTOR3 n;
                    D3DXVec3Cross(&n, &u, &v);
                    D3DXVec3Normalize(&n, &n);
               
                    
            float cosine = D3DXVec3Dot(&n, dir_to_light);
               
                    
            if(cosine < 0.0f)
                        cosine = 0.0f;
               
                    
            return cosine;
                }

            13.4.3 地形陰影(Shading

            一旦知道了如何給指定的方格加陰影,我們就能給地形上所有的方格加陰影。只要遍例每一個(gè)方格,計(jì)算方格的陰影值,并測(cè)量方格對(duì)應(yīng)的texel顏色。光照少則方格會(huì)變暗。
                bool cTerrain::light_terrain(D3DXVECTOR3* dir_to_light)
                {
                    D3DSURFACE_DESC texture_desc;
                    m_texture->GetLevelDesc(0, &texture_desc);
               
                    
            // make sure we got the requested format because our code that fills the texture is
                    // hard coded to a 32 bit pixel depth.
               
                if(texture_desc.Format != D3DFMT_X8R8G8B8)
                        
            return false;
               
                    D3DLOCKED_RECT locked_rect;
                    m_texture->LockRect(0, &locked_rect, NULL, 0);
               
                    DWORD* image_data = (DWORD*) locked_rect.pBits;
               
                    
            for(UINT row = 0; row < texture_desc.Height; row++)
                    {
                        
            for(UINT col = 0; col < texture_desc.Width; col++)
                        {
                            
            // Index into texture, note we use the pitch and divide by four since the pitch is given
                            // in bytes and there are 4 bytes per DWORD.
               
                        int index = row * (locked_rect.Pitch / 4) + col;
               
                            
            // get current color of quad
               
                            D3DXCOLOR color(image_data[index]);
               
                            
            // shade current quad
               
                            color *= compute_shade(row, col, dir_to_light);
               
                            
            // save shade color
               
                            image_data[index] = (D3DCOLOR) color;
                        }
                    }
               
                    m_texture->UnlockRect(0);
               
                    
            return true;
                }

            posted on 2008-04-02 20:31 lovedday 閱讀(1502) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(lèi)(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            亚洲国产精品久久久久| 久久人人爽人人爽人人AV东京热 | 久久久国产一区二区三区| 国产亚洲精久久久久久无码77777| 久久精品人人做人人爽97| 亚洲AV日韩精品久久久久| 久久se精品一区二区影院| 日韩亚洲国产综合久久久| 狠狠色婷婷久久一区二区三区| 久久综合亚洲色一区二区三区| 老男人久久青草av高清| 国产精品久久久天天影视| 国产精品99久久不卡| 久久综合九色综合网站| 国内精品久久久久久久久电影网| 久久久久久综合网天天| 久久精品国产半推半就| 国内精品久久久久久久久| 久久久久久久97| 少妇人妻综合久久中文字幕| 91久久精品国产91性色也| 亚洲综合伊人久久大杳蕉| 久久中文精品无码中文字幕| 成人久久精品一区二区三区| 久久无码专区国产精品发布| 久久久精品视频免费观看 | 国产精品成人久久久久久久| 一本久久精品一区二区| 国产福利电影一区二区三区,免费久久久久久久精 | 久久偷看各类wc女厕嘘嘘| 久久午夜免费视频| 久久久久久亚洲精品不卡 | 久久久国产乱子伦精品作者| 久久精品成人| 久久国产成人| 国产亚州精品女人久久久久久| 999久久久免费国产精品播放| 久久夜色精品国产噜噜麻豆| 久久精品青青草原伊人| 99精品国产99久久久久久97 | 久久香蕉国产线看观看精品yw|