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

            天行健 君子當自強而不息

            創建游戲內核(11)


            本篇是 創建游戲內核(10)的續篇,其中涉及到的頂點緩存知識請參閱D3D中基本立體面的繪制


            頂點和VERTEX_BUFFER

            頂點是一個麻煩的東西,有時對它束手無策,通過提供一種快速創建、設置以及渲染頂點集合的方法,VERTEX_BUFFER類能夠減少此煩惱。

            來看看VERTEX_BUFFER類的定義:

            class VERTEX_BUFFER
            {
            private:
                GRAPHICS*               _graphics;      
            // pointer to graphics object
                IDirect3DVertexBuffer9* _vertex_buffer; // pointer to Direct3D vertex buffer object

                DWORD                   _num_vertices;  
            // number of vertex
                DWORD                   _vertex_size;   // vertex size
                DWORD                   _fvf;           // flexible vertex format

                BOOL                    _is_locked;     
            // flag indicates if vertex buffer has been locked
                char*                   _ptr;           // pointer to vertex data buffer

            public:
                VERTEX_BUFFER();
                ~VERTEX_BUFFER();

                IDirect3DVertexBuffer9* Get_Vertex_buffer_COM();

                unsigned 
            long Get_Vertex_Size();
                unsigned 
            long Get_Vertex_FVF();
                unsigned 
            long Get_Num_Vertices();

                BOOL Create(GRAPHICS* graphics, unsigned 
            long num_vertices, unsigned long vertex_size, DWORD fvf);    
                
            void Free();

                BOOL Is_Loaded();

                BOOL Set(unsigned 
            long first_vertex, unsigned long num_vertices, void* vertex_list);
                BOOL Render(unsigned 
            long first_vertex, unsigned long num_primitives, DWORD type);

                BOOL Lock(unsigned 
            long first_vertex = 0, unsigned long num_vertices = 0);
                BOOL Unlock();
                
            void* Get_Ptr();
            };

            接著是類VERTEX_BUFFER的實現:
            //---------------------------------------------------------------------------
            // Constructor, initialize data member.
            //---------------------------------------------------------------------------
            VERTEX_BUFFER::VERTEX_BUFFER()
            {
                _graphics       = NULL;
                _vertex_buffer  = NULL;
                _ptr            = NULL;

                _num_vertices   = 0;
                _fvf            = 0;

                _is_locked      = FALSE;
            }

            //---------------------------------------------------------------------------
            // Destructor, free vertex buffer resource.
            //---------------------------------------------------------------------------
            VERTEX_BUFFER::~VERTEX_BUFFER()
            {
                Free();
            }

            //---------------------------------------------------------------------------
            // Get pointer to vetex buffer.
            //---------------------------------------------------------------------------
            IDirect3DVertexBuffer9* VERTEX_BUFFER::Get_Vertex_buffer_COM()
            {
                
            return _vertex_buffer;
            }

            //---------------------------------------------------------------------------
            // Gets the size of a vertex for a flexible vertex format (FVF)
            //---------------------------------------------------------------------------
            unsigned long VERTEX_BUFFER::Get_Vertex_Size()
            {
                
            return D3DXGetFVFVertexSize(_fvf);
            }

            //---------------------------------------------------------------------------
            // Get flexible vertex format.
            //---------------------------------------------------------------------------
            unsigned long VERTEX_BUFFER::Get_Vertex_FVF()
            {
                
            return _fvf;
            }

            //---------------------------------------------------------------------------
            // Get number of vertex.
            //---------------------------------------------------------------------------
            unsigned long VERTEX_BUFFER::Get_Num_Vertices()
            {
                
            return _num_vertices;
            }

            //---------------------------------------------------------------------------
            // Create vertex buffer.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::Create(GRAPHICS* graphics, unsigned long num_vertices, unsigned long vertex_size, DWORD fvf)
            {
                
            // free vertex buffer resource first
                Free();

                
            // Check condition

                
            if((_graphics = graphics) == NULL)
                    
            return FALSE;

                
            if(_graphics->Get_Device_COM() == NULL)
                    
            return FALSE;

                
            if(!(_num_vertices = num_vertices) || !(_fvf = fvf) || !(_vertex_size = vertex_size))
                    
            return FALSE;

                
            // create vertex buffer now
                if(FAILED(_graphics->Get_Device_COM()->CreateVertexBuffer(
                    _num_vertices * _vertex_size, 0, _fvf, D3DPOOL_MANAGED, &_vertex_buffer, NULL)))
                    
            return FALSE;

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // Free vertex buffer resource, reset data member.
            //---------------------------------------------------------------------------
            void VERTEX_BUFFER::Free()
            {
                Unlock();

                Release_COM(_vertex_buffer);

                _graphics = NULL;
                _ptr      = NULL;

                _num_vertices = 0;
                _fvf          = 0;

                _is_locked = FALSE;
            }

            //---------------------------------------------------------------------------
            // Copy vertex data from VertexList to vertex buffer.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::Set(unsigned long first_vertex, unsigned long num_vertices, void* vertex_list)
            {
                
            // check condition

                
            if(_graphics == NULL || vertex_list == NULL || _vertex_buffer == NULL)
                    
            return FALSE;

                
            if(_graphics->Get_Device_COM() == NULL)
                    
            return FALSE;

                
            // lock the vertex buffer
                if(! Lock(first_vertex, num_vertices))
                    
            return FALSE;

                
            // copy vertices to vertex buffer
                memcpy(_ptr, vertex_list, num_vertices * _vertex_size);

                
            // unlock vertex buffer
                return Unlock();
            }

            //---------------------------------------------------------------------------
            // Render vertex buffer into display.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::Render(unsigned long first_vertex, unsigned long num_primitives, DWORD type)
            {
                
            if(_graphics->Get_Device_COM() == NULL || _vertex_buffer == NULL)
                    
            return FALSE;

                
            // binds a vertex buffer to a device data stream
                _graphics->Get_Device_COM()->SetStreamSource(0, _vertex_buffer, 0, _vertex_size);

                
            // sets the current vertex stream declaration
                _graphics->Get_Device_COM()->SetFVF(_fvf);

                
            // Renders a sequence of nonindexed, geometric primitives of the specified type from the current set 
                // of data input streams.
                _graphics->Get_Device_COM()->DrawPrimitive((D3DPRIMITIVETYPE) type, first_vertex, num_primitives);

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // Lock vertex buffer from specified position with specified length.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::Lock(unsigned long first_vertex, unsigned long num_vertices)
            {
                
            if(_vertex_buffer == NULL)
                    
            return FALSE;

                
            // locks a range of vertex data and obtains a pointer to the vertex buffer memory
                if(FAILED(_vertex_buffer->Lock(first_vertex * _vertex_size, num_vertices * _vertex_size, (void**)&_ptr, 0)))
                    
            return FALSE;

                _is_locked = TRUE;

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // Unlock vertex buffer.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::Unlock()
            {
                
            if(_vertex_buffer == NULL)
                    
            return FALSE;

                
            if(FAILED(_vertex_buffer->Unlock()))
                    
            return FALSE;

                _is_locked = FALSE;

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // Check whether vertex buffer has created successfully.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::Is_Loaded()
            {
                
            return _vertex_buffer ? TRUE : FALSE;
            }

            //---------------------------------------------------------------------------
            // Ger pointer to vertex data.
            //---------------------------------------------------------------------------
            void* VERTEX_BUFFER::Get_Ptr()
            {
                
            return (void*)_ptr;
            }

            首先必須使用VERTEX_BUFFER::Create函數創建頂點緩沖,此函數的參數有GRAPHICS對象、用于分配空間的頂點數、單個頂點的大小(單位是字節)、可變頂點格式(FVF)。由此可以看出,要使用這個類,還需要創建一個頂點結構體。

            要記得在處理完類的實例后,調用VERTEX_BUFFER::Free函數釋放它。但是,在釋放類的實例之前,需要調用 VERTEX_BUFFER::Set函數給緩沖區填充要使用的頂點信息。VERTEX_BUFFER::Set函數的參數包括要設置的第一個頂點的索引、要設置的頂點數目、一個指向自定義頂點結構體數組的指針。

            經過以上的準備,就可以使用VERTEX_BUFFER::Render函數渲染多邊形了,注意可以指定開始繪制的第一個頂點以及要繪制的圖元(多邊形的面)的總數目。

            type參數的含義如下表所示:

            標志 說明
            D3DPT_POINTLIST 將頂點通過單獨的點集合方式進行渲染。
            D3DPT_LINELIST 將頂點通過單獨的線段集合方式進行渲染。
            D3DPT_LINESTRIP 一連串的線段,每條線段都是從前一個頂點到當前頂點繪制而成。
            D3DPT_TRIANGLELIST 三角形列,其中每個三角形都有三個獨享的頂點。
            D3DPT_TRIANGLESTRIP 三角形帶,每個頂點都使用前面兩個頂點來形成一個面。
            D3DPT_TRIANGLEFAN 三角形扇,每個頂點都使用一個中心頂點和另外兩個頂點形成一個面。


            其中三角形列、帶、扇示意圖如下:

            下面給出測試代碼:


            點擊下載源碼和工程


            /*****************************************************************************
            PURPOSE:
                Test for class VERTEX_BUFFER.
            *****************************************************************************/


            #include "Core_Global.h"

            #pragma warning(disable : 4996)

            //===========================================================================
            // Defines class APP which public inherits from class APPLICATION.
            //===========================================================================
            class APP : public APPLICATION
            {
            private:
                GRAPHICS  _graphics;
                VERTEX_BUFFER _vertex_buffer;    
                
                
            // The 2D vertex format and descriptor
                typedef struct
                {
                    
            float x, y, z;      // 2D coordinates
                    float rhw;          // rhw
                    D3DCOLOR diffuse;   // diffuse color component
                } VERTEX;

                
            #define VERTEX_FVF   (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
                
            public:    
                BOOL Init();
                BOOL Shutdown();
                BOOL Frame();
            };

            //-----------------------------------------------------------------------------
            // Initialize graphics, set display mode, set vertex buffer.
            //-----------------------------------------------------------------------------
            BOOL APP::Init()
            {    
                
            // initialize vertex data
                VERTEX verts[] = {
                  { 100.0f, 100.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                  { 300.0f, 100.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                  { 100.0f, 300.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                  { 300.0f, 300.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                  {  50.0f, 150.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
                  { 350.0f, 150.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
                  {  50.0f, 350.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
                  { 350.0f, 350.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  }
                }; 

                
            // initialize graphics
                if (! _graphics.Init())
                    
            return FALSE;    

                
            // set display mode for graphics
                if(! _graphics.Set_Mode(Get_Hwnd(), TRUE, FALSE, 400, 400, 16))
                    
            return FALSE;
                
                
            // create the vertex buffer
                _vertex_buffer.Create(&_graphics, 8, sizeof(VERTEX), VERTEX_FVF);
               
                
            // Copy vertex data from VertexList to vertex buffer.
                _vertex_buffer.Set(0, 8, verts);

                
            return TRUE;
            }

            //-----------------------------------------------------------------------------
            // Release all d3d resource.
            //-----------------------------------------------------------------------------
            BOOL APP::Shutdown()
            {
                
            // Free vertex buffer resource, reset data member.
                 _vertex_buffer.Free();

                
            return TRUE;
            }

            //-----------------------------------------------------------------------------
            // Render a frame.
            //-----------------------------------------------------------------------------
            BOOL APP::Frame()
            {
                
            // clear display with specified color
                _graphics.Clear_Display(D3DCOLOR_RGBA(0, 0, 0, 255));

                
            // begin scene
                if(_graphics.Begin_Scene())
                {
                    
            // 1) disable alpha blending first
                    _graphics.Enable_Alpha_Blending(FALSE);

                    
            // Render vertex buffer into display.
                    _vertex_buffer.Render(0, 2, D3DPT_TRIANGLESTRIP);

                    
            // 2) enable alpha blending now
                    _graphics.Enable_Alpha_Blending(TRUE);

                    
            // Render vertex buffer into display.
                    _vertex_buffer.Render(4, 2, D3DPT_TRIANGLESTRIP);        

                    
            // end the scene
                    _graphics.End_Scene();       
                }

                
            // display video buffer
                _graphics.Display();
                
                
            return TRUE;
            }

            int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                APP app;

                
            return app.Run();
            }
             
            運行截圖:
             


            posted on 2007-09-03 21:33 lovedday 閱讀(349) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久免费99精品国产自在现线 | 精品国产乱码久久久久软件| 国产亚洲欧美成人久久片 | 久久午夜无码鲁丝片| 色欲av伊人久久大香线蕉影院| 久久国内免费视频| 久久精品国产色蜜蜜麻豆| 亚洲精品乱码久久久久久自慰| 亚洲精品乱码久久久久久久久久久久 | 一日本道伊人久久综合影| 亚洲精品无码久久不卡| 久久精品国产2020| 国产成人综合久久综合| 中文字幕亚洲综合久久2| 久久AⅤ人妻少妇嫩草影院| 欧美日韩中文字幕久久久不卡| 国产一区二区久久久| 久久精品国产亚洲AV无码麻豆 | 99久久国产主播综合精品| 久久久青草青青国产亚洲免观| 欧美亚洲国产精品久久| 精品国际久久久久999波多野| 色综合久久最新中文字幕| 亚洲精品99久久久久中文字幕 | 久久免费高清视频| 久久综合鬼色88久久精品综合自在自线噜噜| 久久经典免费视频| 日本久久久久久中文字幕| 日日狠狠久久偷偷色综合免费| 日韩人妻无码精品久久免费一| 亚洲欧美日韩精品久久| 色妞色综合久久夜夜| 久久精品无码一区二区三区| 亚洲人成无码久久电影网站| av无码久久久久久不卡网站| 污污内射久久一区二区欧美日韩| 国产亚洲精品美女久久久| 亚洲国产精品一区二区三区久久| 国内精品久久久久久野外| 久久无码高潮喷水| 久久人人爽人人澡人人高潮AV |