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

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

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

13.6例子程序: Terrain

該例子是用一個(gè)包含高度信息的RAW文件創(chuàng)建一個(gè)地形,紋理和光源。用方向鍵在地形上行走。

fps.h:

    /*********************************************************************************
    PURPOISE:
        Wraps the code to compute and display the frames rendered per second.
    *********************************************************************************/

   
    #ifndef FPS_H
   
#define FPS_H
   
    #include <d3dx9.h>
   
   
class cFpsCounter
    {
   
private:
        IDirect3DDevice9*    m_device;
        ID3DXFont*            m_font;
   
        DWORD                m_frame_count;
        
float                m_time_elapsed;
        
float                m_fps;
        
char                m_fps_string[9];
   
   
public:
        cFpsCounter(IDirect3DDevice9* device);
        ~cFpsCounter();
   
        
void render(D3DCOLOR color, float time_delta, 
                    
int window_width, int window_height);
    };
   
   
#endif

fps.cpp:
    /*********************************************************************************
    PURPOISE:
        Wraps the code to compute and display the frames rendered per second.
    *********************************************************************************/

   
    #include <cstdio>
    #include "d3dUtility.h"
    #include "fps.h"
   
    #pragma warning(disable : 4996)
   
    cFpsCounter::cFpsCounter(IDirect3DDevice9* device)
    {
        m_device = device;
   
        D3DXFONT_DESC font_desc;
        ZeroMemory(&font_desc, 
sizeof(font_desc));
   
        font_desc.Height            = 25;        
// in logical units
   
        font_desc.Width                = 12;        // in logical units
   
        font_desc.Weight            = 500;        // boldness, range 0(light) - 1000(bold)
   
        font_desc.Italic            = FALSE;
        font_desc.CharSet            = DEFAULT_CHARSET;
        font_desc.OutputPrecision    = 0;
        font_desc.Quality            = 0;
        font_desc.PitchAndFamily    = 0;
   
        strcpy(font_desc.FaceName, "Times New Roman");
   
        D3DXCreateFontIndirect(device, &font_desc, &m_font);
        
        m_frame_count   = 0;
        m_time_elapsed  = 0.0f;
        m_fps            = 0.0f;
        m_fps_string[0] = '\0';
    }
   
    cFpsCounter::~cFpsCounter()
    {
        safe_release<ID3DXFont*>(m_font);
    }
   
   
void cFpsCounter::render(D3DCOLOR color, float time_delta, 
                             
int window_width, int window_height)
    {
        
if(m_font == NULL)
            
return;
   
        m_frame_count++;
        m_time_elapsed += time_delta;
   
        
if(m_time_elapsed >= 1.0f)
        {
            m_fps = m_frame_count / m_time_elapsed;
   
            sprintf(m_fps_string, "%f", m_fps);
            m_fps_string[8] = '\0';        
// mark end of string
   

            m_time_elapsed = 0.0f;
            m_frame_count  = 0;
        }
   
        RECT rect = {0, 0, window_width, window_height};
        m_font->DrawText(NULL, m_fps_string, -1, &rect, DT_TOP | DT_LEFT, color);
    }

TerrainApp.cpp:
     /**************************************************************************************
      Renders a terrain and allows you to walk around it. 
     **************************************************************************************/

   
    #include "d3dUtility.h"
    #include "camera.h"
    #include "terrain.h"
    #include "fps.h"
   
    #pragma warning(disable : 4100)
   
   
const int WIDTH  = 640;
   
const int HEIGHT = 480;
   
    IDirect3DDevice9*    g_device;
    cTerrain*            g_terrain;
    cCamera                g_camera(LAND_OBJECT);
    cFpsCounter*        g_fps_counter;
   
bool                g_draw_triangle;
   
   
////////////////////////////////////////////////////////////////////////////////////////////////////
   

   
bool setup()
    {    
        
// create the terrain
   

        D3DXVECTOR3 dir_to_light(0.0f, 1.0f, 0.0f);
        g_terrain = 
new cTerrain(g_device, "coastMountain64.raw", 64, 64, 10, 0.5f);
        g_terrain->generate_texture(&dir_to_light);
   
        g_fps_counter = 
new cFpsCounter(g_device);
   
        
// set texture filters
   
        g_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        g_device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
   
        
// set the projection matrix
   
    D3DXMATRIX proj;
        D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI/2.0f, (
float)WIDTH/HEIGHT, 1.0f, 1000.0f);
        g_device->SetTransform(D3DTS_PROJECTION, &proj);
        
        
return true;
    }
   
   
///////////////////////////////////////////////////////////////////////////////////////////////////////
   

   
void cleanup()
    {    
        delete g_terrain;
        delete g_fps_counter;
    }
   
   
///////////////////////////////////////////////////////////////////////////////////////////////////////
   

   
bool display(float time_delta)
    {
        
// update the camera
   

        
if(GetAsyncKeyState(VK_UP) & 0x80000f)
            g_camera.walk(100.0f * time_delta);
   
        
if( GetAsyncKeyState(VK_DOWN) & 0x8000f )
            g_camera.walk(-100.0f * time_delta);
   
        
if( GetAsyncKeyState(VK_LEFT) & 0x8000f )
            g_camera.yaw(-1.0f * time_delta);
   
        
if( GetAsyncKeyState(VK_RIGHT) & 0x8000f )
            g_camera.yaw(1.0f * time_delta);
   
        
if( GetAsyncKeyState('N') & 0x8000f )
            g_camera.strafe(-100.0f * time_delta);
   
        
if( GetAsyncKeyState('M') & 0x8000f )
            g_camera.strafe(100.0f * time_delta);
   
        
if(GetAsyncKeyState('W') & 0x8000f)
            g_camera.pitch(1.0f * time_delta);
   
        
if(GetAsyncKeyState('S') & 0x8000f)
            g_camera.pitch(-1.0f * time_delta);
   
        
// set camera height    
   
    float height = g_terrain->get_height(g_camera.m_pos.x, g_camera.m_pos.z);
        g_camera.m_pos.y = height + 5.0f;    
// add height because we're standing up    
   
        // update the view matrix representing the camera's new position/orientation
   
    D3DXMATRIX view_matrix;
        g_camera.get_view_matrix(&view_matrix);
        g_device->SetTransform(D3DTS_VIEW, &view_matrix);
   
        
// render now
   

        g_device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
   
        g_device->BeginScene();
   
        D3DXMATRIX identity_matrix;
        D3DXMatrixIdentity(&identity_matrix);
        
        g_terrain->draw(&identity_matrix, g_draw_triangle);
        g_fps_counter->render(0xffffffff, time_delta, WIDTH, HEIGHT);    
        
        g_device->EndScene();
   
        g_device->Present(NULL, NULL, NULL, NULL);
   
        
return true;
    }
   
   
///////////////////////////////////////////////////////////////////////////////////////////////////////
   

    LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
    {
        
switch(msg)
        {
        
case WM_DESTROY:
            PostQuitMessage(0);
            
break;
   
        
case WM_KEYDOWN:
            
if(word_param == VK_ESCAPE)
                DestroyWindow(hwnd);
   
            
if(word_param == VK_SPACE)
                g_draw_triangle = !g_draw_triangle;
   
            
break;
        }
   
        
return DefWindowProc(hwnd, msg, word_param, long_param);
    }
   
   
///////////////////////////////////////////////////////////////////////////////////////////////////////
   

   
int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
    {
        
if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_device))
        {
            MessageBox(NULL, "init_d3d() - failed.", 0, MB_OK);
            
return 0;
        }
   
        
if(! setup())
        {
            MessageBox(NULL, "Steup() - failed.", 0, MB_OK);
            
return 0;
        }
   
        enter_msg_loop(display);
   
        cleanup();
        g_device->Release();
   
        
return 0;
    }

下載源程序

13.7 一些改進(jìn)

Terrain讀取頂點(diǎn)數(shù)據(jù)到一個(gè)很大的緩存,在多重的頂點(diǎn)緩存中劃分地形結(jié)構(gòu),在速度和可測(cè)量性方面都十分有利。為我們提出一個(gè)問題:頂點(diǎn)緩存最大支持多大?回答是,這依賴于你的硬件。所以你必須先檢測(cè)。

將地圖劃分為許多小的頂點(diǎn)緩存是重要的練習(xí),然后將類似矩陣的數(shù)據(jù)結(jié)構(gòu)編入索引,并且管理數(shù)據(jù),這不需要引入新的概念。我們不必詳細(xì)討論它。簡(jiǎn)單的說,你基本上站在地形中一個(gè)我們叫做“blocks”的矩陣上,每個(gè)block是地形的一個(gè)矩形區(qū)域。另外,每個(gè)block區(qū)域(在它自己的頂點(diǎn)索引緩存中)的下方包含地形中的幾何信息,為了畫它在地形中的位置。

另外,你可以讀取地形到一個(gè)很大的ID3DXMesh接口。使用D3D函數(shù)D3DXSplitMesh劃分地形為許多小的Mesh,以下是D3DXSplitMesh函數(shù)原型:

               
       

void         D3DXSplitMesh(

       

            const LPD3DXMESH pMeshIn,

       

            const DWORD *pAdjacencyIn,

       

            const DWORD MaxSize,

       

            const DWORD Options,

       

            DWORD *pMeshesOut,

       

            LPD3DXBUFFER *ppMeshArrayOut,

       

            LPD3DXBUFFER *ppAdjacencyArrayOut,

       

            LPD3DXBUFFER *ppFaceRemapArrayOut,

       

            LPD3DXBUFFER *ppVertRemapArrayOut

       

);

這個(gè)函數(shù)將一個(gè)源Mesh劃分多個(gè)小的Mesh,pMeshIn參數(shù)是一個(gè)指針,指向想劃分的MeshpAdjacencyIn指向一個(gè)鄰接數(shù)組,MaxSize參數(shù)指定作為結(jié)果返回的最大頂點(diǎn)數(shù),為返回的Meshe使用指定的創(chuàng)建標(biāo)記,pMeshesOut參數(shù)返回ppMeshArrayOut數(shù)組中的Mesh數(shù)量,最后3個(gè)參數(shù)是可選的(可以指定為null),返回鄰接信息的數(shù)組。

posted on 2008-04-02 21:42 lovedday 閱讀(3324) 評(píng)論(9)  編輯 收藏 引用

評(píng)論

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-04-12 18:48 學(xué)生

VS2005編譯能通過但是運(yùn)行就會(huì)崩潰 哪里出問題了?向樓主請(qǐng)教  回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-04-12 19:13 lovedday

提示什么?自己在debug模式調(diào)試下。
我測(cè)試的時(shí)候沒發(fā)現(xiàn)問題。  回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-04-12 20:00 學(xué)生

@lovedday
信息如下

fail: d:\program files\microsoft visual studio 8\vc\include\vector
line :756
Expression: vector subscript out of range
for information on how your program can cause an assertion failure,
see the visual c++ documentation on asserts.
我是新人 麻煩樓主多多指教  回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-04-12 21:02 lovedday

你把float cTerrain::get_height(float x, float z)中這幾行替換成下面試試看,小bug:

if(row < 0)
row = 0;

if(row > m_num_cells_per_col - 1)
row = m_num_cells_per_col - 1;

if(col < 0)
col = 0;

if(col > m_num_cells_per_row - 1)
col = m_num_cells_per_row - 1;  回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-04-12 23:12 學(xué)生

把>=改成=就可以了嗎 改完之后還是過不去 原因同上
  回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-04-13 08:48 lovedday

你必須查看調(diào)用棧的上一層來找到出bug的代碼行。

這些是STL里的代碼:

fail: d:\program files\microsoft visual studio 8\vc\include\vector
line :756   回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-05-16 15:18 vw

博主你好.我想請(qǐng)教一下.
假設(shè),這只是一個(gè)假設(shè).我的顯卡只支持 10240 個(gè)頂點(diǎn).30720 個(gè)索引頂點(diǎn).那么.我能不能.使用 D3DXCreateMeshFVF 函數(shù)創(chuàng)建一個(gè)空的模型.在頂點(diǎn)數(shù)和面數(shù)的參數(shù)的設(shè)置上遠(yuǎn)遠(yuǎn)超出顯卡所支持的數(shù)量.比如我在創(chuàng)建時(shí)使用了.
1024000000個(gè)頂點(diǎn).然后在用 D3DXSplitMesh 把這個(gè)新建的 Mesh 給分解了,這樣做可以嗎?
如果可以.那么我就可以把他Mesh轉(zhuǎn)換成.ID3DXPMesh 接口.來取帶LOD.
那么,距離眼睛越近.頂點(diǎn)和3角型就越多.如果我再加上幾個(gè)人物模型就超出了顯卡所支持頂點(diǎn)時(shí).我該怎么辦呢? 因?yàn)槲覠o法想到在我的視圖中除了地圖還會(huì)有多少個(gè)模型.(玩家有時(shí)多.有時(shí)少的情況).

再比如一個(gè)畫面中出現(xiàn)成千上萬的玩家的時(shí)候. 您看.地圖.建筑.NPC.玩家.天空盒.這些是一個(gè)也不能少.那么各模型頂點(diǎn)減到最低成度時(shí).頂點(diǎn)還是超過了.我應(yīng)該怎么辦呢?  回復(fù)  更多評(píng)論   

# re: D3D中的地形繪制基礎(chǔ)(5) 2008-05-16 17:35 lovedday

@vw
你的顯卡只支持 10240 個(gè)頂點(diǎn).30720 個(gè)索引頂點(diǎn),你在創(chuàng)建時(shí)使用了.
1024000000個(gè)頂點(diǎn),應(yīng)該是不能創(chuàng)建成功的。  回復(fù)  更多評(píng)論   

# 這里有解決方法 2009-03-06 21:54 ykxggg

http://bbs.gameres.com/showthread.asp?threadid=124286  回復(fù)  更多評(píng)論   


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

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

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一级午夜免费电影| 在线精品亚洲| 久久久久这里只有精品| 欧美一区午夜精品| 久久久av网站| 欧美v国产在线一区二区三区| 男女精品网站| 欧美日韩中字| 国产欧美日韩综合一区在线播放| 国产日韩成人精品| 亚洲成色精品| 亚洲欧美在线x视频| 久热精品在线| 亚洲免费大片| 久久精品一区蜜桃臀影院| 女仆av观看一区| 国产乱码精品| 一区二区三区日韩精品| 久久一区中文字幕| 99国产成+人+综合+亚洲欧美| 亚洲永久在线观看| 欧美二区在线播放| 国产亚洲免费的视频看| 一本色道88久久加勒比精品| 久久精品夜夜夜夜久久| 最新国产乱人伦偷精品免费网站 | 伊人成人在线视频| 99re6热只有精品免费观看 | 欧美黄在线观看| 国产欧美日韩不卡免费| 亚洲精选国产| 久久永久免费| 午夜精品久久久| 亚洲一区中文| 欧美电影免费观看网站| 亚洲一区二区三区四区五区黄| 另类人畜视频在线| 国产欧美精品国产国产专区| 亚洲乱码一区二区| 蜜桃精品一区二区三区 | 美女诱惑黄网站一区| 亚洲天堂激情| 欧美三级在线| 在线亚洲自拍| 亚洲美女精品久久| 欧美福利在线观看| 亚洲国产99精品国自产| 久久午夜电影| 欧美亚洲三级| 欧美日韩国产一中文字不卡| 亚洲精品1区| 欧美成人a视频| 久久久国产精品一区二区中文 | 99热免费精品| 欧美国产极速在线| 麻豆成人精品| 亚洲欧洲精品一区二区三区波多野1战4| 久久成人精品一区二区三区| 葵司免费一区二区三区四区五区| 欧美一级视频精品观看| 亚洲电影免费观看高清完整版| 麻豆91精品| 女生裸体视频一区二区三区| 亚洲精品视频在线播放| 91久久精品日日躁夜夜躁国产| 欧美电影在线播放| 一本一本久久| 欧美一区影院| 久久狠狠亚洲综合| 在线看视频不卡| 91久久精品国产91久久| 欧美色综合网| 久久久久久久尹人综合网亚洲| 久久精品国产精品亚洲综合| 亚洲激情成人网| 99re6这里只有精品| 国产精品一二三四区| 久久这里只精品最新地址| 免费不卡中文字幕视频| 亚洲免费av观看| 亚洲无亚洲人成网站77777 | 国产精品视频一| 久久久99爱| 欧美精品色网| 久久99伊人| 欧美sm视频| 午夜视频在线观看一区二区三区| 最新亚洲视频| 亚洲男人天堂2024| 午夜视黄欧洲亚洲| 最新高清无码专区| 亚洲性夜色噜噜噜7777| 国际精品欧美精品| 亚洲人成在线观看一区二区| 国产精品丝袜xxxxxxx| 另类酷文…触手系列精品集v1小说| 欧美电影打屁股sp| 欧美在线观看一二区| 欧美不卡一卡二卡免费版| 午夜视频一区| 欧美区一区二区三区| 久久亚洲精品视频| 欧美性大战久久久久久久蜜臀| 免费成人小视频| 国产欧美日韩亚洲精品| 亚洲乱码国产乱码精品精| 精品电影在线观看| 亚洲欧美激情四射在线日| 亚洲免费成人av电影| 久久精品91久久香蕉加勒比 | 一级成人国产| 久久躁狠狠躁夜夜爽| 欧美中文在线免费| 欧美日韩一区在线观看| 欧美国产一区二区三区激情无套| 国产精品美女诱惑| 一本一本久久a久久精品牛牛影视| 亚洲福利视频一区二区| 久久www免费人成看片高清| 亚洲欧美日韩精品久久奇米色影视 | 久久国产婷婷国产香蕉| 欧美视频中文一区二区三区在线观看| 欧美大尺度在线| 亚洲激情一区二区三区| 每日更新成人在线视频| 噜噜噜在线观看免费视频日韩| 国产美女精品视频免费观看| 一区二区三区久久网| 亚洲一区二区在线免费观看| 欧美日韩免费| 99国产精品99久久久久久| 日韩视频免费在线| 欧美日韩ab片| 日韩亚洲欧美综合| 亚洲天天影视| 国产精品欧美日韩久久| 亚洲女ⅴideoshd黑人| 欧美在线亚洲综合一区| 国产深夜精品| 久久黄色小说| 欧美高清在线| 一本一道久久综合狠狠老精东影业 | 亚洲精选视频在线| 欧美国产日韩亚洲一区| 欧美一区二区三区四区在线 | 亚洲一区二区3| 伊人久久av导航| 韩日精品视频| 亚洲精品裸体| 欧美一二三区精品| 蜜桃精品久久久久久久免费影院| 亚洲无玛一区| 一本久久a久久精品亚洲| 日韩一区二区高清| 欧美日韩在线观看视频| 亚洲午夜久久久| 久久久久久久久伊人| 在线成人av网站| 欧美成人伊人久久综合网| 99re成人精品视频| 久久精品国产一区二区三区免费看| 激情文学综合丁香| 欧美精品久久99| 午夜激情综合网| 欧美国产激情二区三区| 中文精品一区二区三区| 国产日韩一区在线| 免费日韩av电影| 亚洲午夜在线| 免费毛片一区二区三区久久久| 一区二区欧美视频| 韩国成人精品a∨在线观看| 欧美激情按摩在线| 欧美专区日韩专区| 日韩视频一区二区在线观看| 久久精品电影| 中文一区二区| 亚洲高清在线精品| 国产欧美日韩精品丝袜高跟鞋| 欧美成人综合一区| 欧美一区二区在线免费观看| 亚洲人www| 玖玖视频精品| 亚洲欧美中文在线视频| 亚洲肉体裸体xxxx137| 国产一区二区| 国产精品a级| 欧美精品午夜视频| 久久人人九九| 欧美诱惑福利视频| 亚洲天堂成人在线视频| 亚洲黄色尤物视频| 蜜桃久久av一区| 久久精品99| 欧美一区二区三区免费观看视频| 亚洲看片免费| 亚洲日本一区二区三区| 亚洲第一在线视频| 一区在线播放视频| 黄色成人在线|