青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

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

新建網(wǎng)頁 1

13.2.1 計(jì)算頂點(diǎn)

在圖13.4中,計(jì)算三角形網(wǎng)格上的頂點(diǎn),我們只是在開始產(chǎn)生頂點(diǎn)的地方,一行一行的生成頂點(diǎn)數(shù)據(jù),直到結(jié)束為止。單元格的頂點(diǎn)與頂點(diǎn)之間有一塊空白區(qū)域,這會讓我們?nèi)〉脁、z坐標(biāo),但y坐標(biāo)是什么呢?得到y(tǒng)坐標(biāo)很容易,當(dāng)讀取高度圖數(shù)據(jù)結(jié)構(gòu)時(shí)會找到對應(yīng)的入口。

注意:這個操作使用一個巨大的頂點(diǎn)緩存去保存所有地形上的所有頂點(diǎn)。這可能會引起硬件局限性的問題。例如:3D設(shè)備都預(yù)設(shè)了最大圖元數(shù)和最大頂點(diǎn)索引值。檢查D3DCAPS9結(jié)構(gòu)的MaxPrimitiveCount和MaxVertexlndex成員來獲得你的設(shè)備的限定值。

計(jì)算紋理坐標(biāo),看圖13.5,給我們一個簡單的設(shè)定,允許我們用(u, v)紋理坐標(biāo)去對應(yīng)地形頂點(diǎn)坐標(biāo)。

最后,用代碼生成頂點(diǎn):

    bool cTerrain::generate_vertices()
    {
        
if(FAILED(m_device->CreateVertexBuffer(m_num_vertices * sizeof(cTerrainVertex), D3DUSAGE_WRITEONLY,
            TERRAIN_VERTEX_FVF, D3DPOOL_MANAGED, &m_vertex_buffer, NULL)))
        {
            
return false;
        }
    
        
// coordinates to start generating vertices at
    
    int start_x = -m_width / 2;
        
int start_z =  m_depth / 2;
    
        
// coordinates to end generating vertices at
    
    int end_x =  m_width / 2;
        
int end_z = -m_depth / 2;
    
        
// compute the increment size of the texture coordinates from one vertex to the next
    
    float u_coord_increment_size = 1.0f / m_num_cells_per_row;
        
float v_coord_increment_size = 1.0f / m_num_cells_per_col;
    
        cTerrainVertex* v;
    
        m_vertex_buffer->Lock(0, 0, (
void**)&v, 0);
    
        
int row = 0;
    
        
for(int z = start_z; z >= end_z; z -= m_cell_spacing)
        {
            
int column = 0;
    
            
for(int x = start_x; x <= end_x; x += m_cell_spacing)
            {
                
int index = row * m_num_verts_per_row + column;
    
                v[index] = cTerrainVertex(x, m_height_map[index], z,
                                          column * u_coord_increment_size, row * v_coord_increment_size);
    
                column++;
            }
    
            row++;
        }
    
    
        m_vertex_buffer->Unlock();
        
        
return true;
    }

13.2.2 計(jì)算索引-定義三角形

計(jì)算三角形網(wǎng)格的索引,只需要循環(huán)訪問每一個格子,從左上到右下,如圖13.4,并且計(jì)算組成格子的2個三角形。

代碼生成索引:

    bool cTerrain::generate_indices()
    {
        
if(FAILED(m_device->CreateIndexBuffer(
            m_num_triangles * 3 * 
sizeof(WORD),    // 3 indices per triangle
    
            D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_index_buffer, NULL)))
        {
            
return false;
        }
    
        WORD* indices;
    
        m_index_buffer->Lock(0, 0, (
void**)&indices, 0);
    
        
// index to start of a group of 6 indices that describe the two triangles that make up a quad
    
    int base_index = 0;
    
        
// loop through and compute the triangles of each quad
    
    for(int row = 0; row < m_num_cells_per_col; row++)
        {
            
for(int col = 0; col < m_num_cells_per_row; col++)
            {
                indices[base_index]        = row      * m_num_verts_per_row + col;
                indices[base_index + 1] = row      * m_num_verts_per_row + (col+1);
                indices[base_index + 2] = (row+1) * m_num_verts_per_row + col;
    
                indices[base_index + 3]    = (row+1) * m_num_verts_per_row + col;
                indices[base_index + 4] = row      * m_num_verts_per_row + (col+1);
                indices[base_index + 5] = (row+1) * m_num_verts_per_row + (col+1);
    
                base_index += 6;    
// next quad
    
        }
        }
    
        m_index_buffer->Unlock();
    
        
return true;
    }

13.3紋理

cTerrain類提供2個方法去處理地形的紋理。最簡單的方法是讀取一個已經(jīng)制作好的紋理文件并使用它:
    bool cTerrain::load_texture(const string& filename)
    {
        
if(FAILED(D3DXCreateTextureFromFile(m_device, filename.c_str(), &m_texture)))
            
return false;
    
        
return true;
    }

13.3.1 程序上的處理方法

一個可選擇的方法是用程序計(jì)算地形的紋理,就是說,我們創(chuàng)建一個空紋理,根據(jù)定義的參數(shù)用代碼計(jì)算每一個部分的顏色,在例子中,參數(shù)是地形的高度。

我們用cTerrain::generate_texture方法去生成紋理,首先用D3DXCreateTexture方法創(chuàng)建一個空的紋理,鎖定高度級別(top level,紋理圖的一個成員,有多個級別),不斷的循環(huán)每一個texel圖素)并給它上色,texel的顏色取決于與方格對應(yīng)的高度(近似高度)。我們的想法是:地形中較低的地方是沙灘色,中間的地方像是綠色的小山丘,較高的地方顏色好像雪山。我們定義的高度是方格中左上角的近似高度。

一旦每個texel都有了顏色,我們想讓每一個texel變暗或是變亮,這基于光打在格子中對應(yīng)的texel上的角度,由Terrain::lightTerrain方法實(shí)現(xiàn)。
    bool cTerrain::generate_texture(D3DXVECTOR3* dir_to_light)
    {
        
// Method fills the top surface of a texture procedurally, then lights the top surface.
        // Finally, it fills the other mipmap surfaces based on the top surface data using D3DXFilterTexture.
    
        // texel for each quad cell
    
    int texture_width  = m_num_cells_per_row;
        
int texture_height = m_num_cells_per_col;
    
        
// create an empty texture with a complete mipmap chain
    
    if(FAILED(D3DXCreateTexture(m_device, texture_width, texture_height, 0, 0, D3DFMT_X8R8G8B8,
                                    D3DPOOL_MANAGED, &m_texture)))
        {
            
return false;
        }
    
        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;
    
        
// lock top entire texture surface
    
    D3DLOCKED_RECT locked_rect;
        m_texture->LockRect(0, &locked_rect, NULL, 0);
    
        DWORD* image_data = (DWORD*) locked_rect.pBits;
    
        
for(int row = 0; row < texture_height; row++)
        {
            
for(int col = 0; col < texture_width; col++)
            {
                D3DXCOLOR color;
    
                
// get height of upper left vertex of quad
    
            float height = get_height_map_entry(row, col) / m_height_scale;
    
                
if(height < 42.5f)          color = BEACH_SAND;
                
else if(height < 85.0f)  color = LIGHT_YELLOW_GREEN;
                
else if(height < 127.5f) color = PUREGREEN;
                
else if(height < 170.0f) color = DARK_YELLOW_GREEN;
                
else if(height < 212.5f) color = DARKBROWN;
                
else                     color = WHITE;
    
                
// fill locked data, note we divide the pitch by four because the pitch is given in bytes
                // and there are 4 bytes per DWORD.
    
                image_data[row * (locked_rect.Pitch / 4) + col] = (D3DCOLOR) color;
            }
        }
    
        m_texture->UnlockRect(0);
    
        
if(! light_terrain(dir_to_light))
        {
            MessageBox(NULL, "light_terrain() - FAILED", "ERROR", MB_OK);
            
return false;
        }
    
        
if(FAILED(D3DXFilterTexture(m_texture, NULL, 0, D3DX_DEFAULT)))
        {
            MessageBox(NULL, "D3DXFilterTexture() - FAILED", "ERROR", MB_OK);
            
return false;
        }
    
        
return true;
    }

posted on 2008-04-02 19:41 lovedday 閱讀(1916) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            老司机一区二区| 激情视频一区二区三区| 亚洲影音先锋| 国产精品都在这里| 久久gogo国模裸体人体| 久久gogo国模裸体人体| 亚洲高清久久网| 亚洲精选在线观看| 国产精品国产三级国产普通话蜜臀 | 亚洲激情一区二区三区| 免费观看日韩av| 国产精品99久久不卡二区| 亚洲一区欧美激情| 亚洲国产小视频在线观看| 亚洲三级视频| 国产一区二区三区在线观看视频| 美女啪啪无遮挡免费久久网站| 欧美韩日一区二区| 欧美一区二区三区视频免费| 久久精品在这里| 国产精品99久久久久久久vr| 午夜精品99久久免费| 亚洲人午夜精品| 亚洲欧美视频在线观看| 亚洲激情视频在线观看| 中文av一区特黄| 亚洲青涩在线| 欧美一区视频在线| 一区二区欧美亚洲| 久久天堂av综合合色| 亚洲自拍偷拍麻豆| 欧美ed2k| 久久亚洲综合网| 国产精品美女久久| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美不卡在线视频| 欧美一区二区在线看| 欧美激情亚洲视频| 久久综合九色99| 国产精品亚洲综合久久| 亚洲精品一区中文| 亚洲国产一区二区三区青草影视 | 亚洲午夜视频| 夜夜嗨av色综合久久久综合网| 欧美怡红院视频| 小黄鸭视频精品导航| 欧美日韩一区二区三区| 亚洲第一区在线观看| 红桃视频国产精品| 新67194成人永久网站| 亚洲欧美国产日韩中文字幕| 欧美久久综合| 亚洲欧洲另类国产综合| 亚洲欧洲一区| 久色婷婷小香蕉久久| 久久亚洲精选| 黄色在线成人| 久久久国产精品一区二区中文| 欧美伊人久久久久久久久影院| 另类图片综合电影| 国产自产2019最新不卡| 性久久久久久| 久久久久久久91| 国内精品亚洲| 久久综合五月| 亚洲电影下载| 一本高清dvd不卡在线观看| 欧美好骚综合网| 亚洲精品欧美极品| 亚洲一级一区| 国产精品日本| 久久精品一区中文字幕| 欧美成在线观看| 亚洲精品久久久久中文字幕欢迎你 | av成人毛片| 午夜精品视频在线| 国产在线拍揄自揄视频不卡99| 欧美亚洲一区| 免费在线看一区| 亚洲精品免费在线播放| 欧美日韩在线播放三区四区| 亚洲视频在线观看| 久久久久久有精品国产| 在线观看日韩专区| 欧美日本高清| 亚洲欧美国产日韩天堂区| 久色婷婷小香蕉久久| 亚洲欧洲一区二区天堂久久| 欧美午夜不卡| 欧美专区日韩视频| 亚洲国产欧美日韩| 亚洲视频视频在线| 激情小说另类小说亚洲欧美| 欧美激情成人在线视频| 亚洲人体一区| 国产精品久久午夜夜伦鲁鲁| 欧美在线观看一区二区| 91久久精品一区二区别| 欧美一区高清| 亚洲美女啪啪| 国产伊人精品| 欧美三日本三级三级在线播放| 小黄鸭精品密入口导航| 亚洲日本黄色| 麻豆国产精品一区二区三区| 在线亚洲一区观看| 一色屋精品视频免费看| 国产精品成人观看视频免费| 久久免费高清视频| 亚洲综合久久久久| 亚洲精品国产视频| 蜜臀久久久99精品久久久久久| 亚洲线精品一区二区三区八戒| 精品88久久久久88久久久| 欧美午夜片在线观看| 鲁鲁狠狠狠7777一区二区| 香港久久久电影| 日韩视频一区二区三区在线播放免费观看 | 国产亚洲观看| 国产精品高清网站| 欧美精品乱人伦久久久久久| 久久久久综合| 欧美一区二区久久久| 国内精品久久久| 国产精品一页| 国产精品嫩草影院一区二区| 欧美精品97| 欧美激情综合在线| 欧美大色视频| 欧美成人自拍| 欧美aa在线视频| 嫩草国产精品入口| 蜜臀av国产精品久久久久| 久久精品九九| 久久精品视频在线| 久久高清免费观看| 欧美中文在线观看| 欧美影院久久久| 欧美自拍丝袜亚洲| 久久精品色图| 老司机凹凸av亚洲导航| 狂野欧美性猛交xxxx巴西| 久久亚洲图片| 久久综合久久久| 欧美/亚洲一区| 欧美日韩麻豆| 欧美午夜在线视频| 国产精品网站在线观看| 国产日韩1区| 狠狠干狠狠久久| 亚洲国产mv| 99视频一区| 午夜久久久久久| 久久久久成人精品| 欧美mv日韩mv国产网站app| 欧美大片在线观看| 亚洲另类在线视频| 亚洲在线网站| 久久久女女女女999久久| 欧美1区2区视频| 国产精品久久久久久福利一牛影视 | 日韩亚洲欧美一区| 亚洲淫片在线视频| 久久频这里精品99香蕉| 牛牛国产精品| 国产精品久久久久三级| 国产日韩精品一区二区三区 | 欧美日韩一级片在线观看| 国产精品日韩高清| 亚洲第一在线视频| 亚洲天堂网站在线观看视频| 久久精品国内一区二区三区| 欧美激情1区2区3区| 一本色道久久加勒比精品| 亚洲免费在线| 欧美国产日本在线| 国产久一道中文一区| 亚洲国产一区二区三区青草影视| 亚洲一区二区在线看| 久久综合成人精品亚洲另类欧美| 亚洲人成人99网站| 欧美影院在线播放| 欧美日一区二区三区在线观看国产免 | 久久久噜噜噜久久久| 欧美手机在线视频| 亚洲国产欧美另类丝袜| 午夜精品久久久久久99热软件 | 欧美在线亚洲综合一区| 欧美国产视频日韩| 午夜精品剧场| 欧美日本一区二区高清播放视频| 国模一区二区三区| 午夜精品免费| 99精品视频一区| 麻豆av福利av久久av| 国产午夜久久久久| 香蕉久久久久久久av网站| 亚洲欧洲日本专区| 男人的天堂亚洲| 在线免费日韩片|