• <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ǔ)(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 閱讀(3305) 評(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)論

            久久国产精品-国产精品| 四虎久久影院| 亚洲精品无码久久久久久| 人人妻久久人人澡人人爽人人精品| 国产精品美女久久久久久2018| 久久久久久久久66精品片| 久久久久国产精品麻豆AR影院| 久久777国产线看观看精品| 久久播电影网| 久久亚洲中文字幕精品有坂深雪 | 久久精品国产亚洲AV大全| 欧美亚洲国产精品久久蜜芽| 亚洲精品tv久久久久| 国产精品久久久久天天影视| 亚洲午夜无码AV毛片久久| 国产精品天天影视久久综合网| 久久香蕉国产线看观看猫咪?v| 国产精品久久永久免费| 一级a性色生活片久久无| 久久高潮一级毛片免费| 9久久9久久精品| 亚洲香蕉网久久综合影视| 久久这里有精品视频| 久久这里只有精品久久| 久久久精品人妻一区二区三区四| 亚洲色欲久久久久综合网| 久久毛片免费看一区二区三区| 久久91亚洲人成电影网站| 99久久人妻无码精品系列蜜桃| 久久精品国产亚洲AV蜜臀色欲| 欧美大战日韩91综合一区婷婷久久青草 | 无码国内精品久久人妻麻豆按摩| 国产精品va久久久久久久| 97热久久免费频精品99| 久久久久亚洲av无码专区喷水| 久久精品国产AV一区二区三区| 久久国产成人午夜AV影院| 精品久久久久久无码人妻热| 久久er国产精品免费观看8| 99久久精品国产毛片| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区|