• <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)而不息

            Direct3D程序設(shè)計(jì)基礎(chǔ)(1)

            Direct3D對(duì)象

            Microsoft Direct3D的一種實(shí)現(xiàn)方式是通過(guò)組件對(duì)象模型(Component Object Model, COM)及其接口實(shí)現(xiàn)的,在用C++語(yǔ)言和COM接口方式開(kāi)發(fā)的程序中可以直接訪問(wèn)這些接口和對(duì)象。Direct3D對(duì)象是Direct3D程序中需要?jiǎng)?chuàng)建的第一個(gè)對(duì)象,也是需要最后一個(gè)釋放的對(duì)象,這里所說(shuō)的對(duì)象是指COM對(duì)象。通過(guò)Direct3D對(duì)象,可以枚舉和檢索Direct3D設(shè)備,這樣應(yīng)用程序就可以在不需要?jiǎng)?chuàng)建設(shè)備對(duì)象的前提下選擇Direct3D渲染設(shè)備。

            在用C++語(yǔ)言編寫(xiě)Direct3D程序時(shí),需要先獲取一個(gè)指向IDirect3D9接口的指針,從而可以通過(guò)該接口調(diào)用Direct3D對(duì)象的功能。

             

            創(chuàng)建Direct3D設(shè)備對(duì)象

            創(chuàng)建Direct3D設(shè)備對(duì)象時(shí),需要先創(chuàng)建Direct3D對(duì)象,然后再調(diào)用Direct3D對(duì)象的接口函數(shù)IDirect3D9::CreateDevice創(chuàng)建Direct3D設(shè)備對(duì)象。通過(guò)同一個(gè)Direct3D對(duì)象創(chuàng)建的所有Direct3D設(shè)備對(duì)象共享相同的物理資源(顯卡)。因?yàn)楣蚕硗挥布匀绻ㄟ^(guò)一個(gè)Direct3D對(duì)象創(chuàng)建多個(gè)Direct3D渲染設(shè)備對(duì)象會(huì)明顯降低系統(tǒng)性能。

            在創(chuàng)建Direct3D設(shè)備對(duì)象之前,還需要先初始化D3DPRESENT_PARAMETERS結(jié)構(gòu),該結(jié)構(gòu)用于創(chuàng)建Direct3D設(shè)備對(duì)象。D3DPRESENT_PARAMETERS結(jié)構(gòu)定義了Direct3D設(shè)備對(duì)象的相關(guān)信息,而這些信息將會(huì)影響Direct3D設(shè)備的顯示方法。該結(jié)構(gòu)的定義如下:

            Describes the presentation parameters.

            typedef struct D3DPRESENT_PARAMETERS {
            UINT BackBufferWidth, BackBufferHeight;
            D3DFORMAT BackBufferFormat;
            UINT BackBufferCount;
            D3DMULTISAMPLE_TYPE MultiSampleType;
            DWORD MultiSampleQuality;
            D3DSWAPEFFECT SwapEffect;
            HWND hDeviceWindow;
            BOOL Windowed;
            BOOL EnableAutoDepthStencil;
            D3DFORMAT AutoDepthStencilFormat;
            DWORD Flags;
            UINT FullScreen_RefreshRateInHz;
            UINT PresentationInterval;
            } D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;

            Members

            BackBufferWidth, BackBufferHeight
            Width and height of the new swap chain's back buffers, in pixels. If Windowed is FALSE (the presentation is full-screen), these values must equal the width and height of one of the enumerated display modes found through IDirect3D9::EnumAdapterModes. If Windowed is TRUE and either of these values is zero, the corresponding dimension of the client area of the hDeviceWindow (or the focus window, if hDeviceWindow is NULL) is taken.
            BackBufferFormat
            The back buffer format. For more information about formats, see D3DFORMAT. This value must be one of the render-target formats as validated by IDirect3D9::CheckDeviceType. You can use IDirect3DDevice9::GetDisplayMode to obtain the current format.

            In fact, D3DFMT_UNKNOWN can be specified for the BackBufferFormat while in windowed mode. This tells the runtime to use the current display-mode format and eliminates the need to call IDirect3DDevice9::GetDisplayMode.

            For windowed applications, the back buffer format no longer needs to match the display-mode format because color conversion can now be done by the hardware (if the hardware supports color conversion). The set of possible back buffer formats is constrained, but the runtime will allow any valid back buffer format to be presented to any desktop format. (There is the additional requirement that the device be operable in the desktop mode; devices typically do not operate in 8 bits per pixel modes.)

            Full-screen applications cannot do color conversion.

            BackBufferCount
            This value can be between 0 and D3DPRESENT_BACK_BUFFERS_MAX (or D3DPRESENT_BACK_BUFFERS_MAX_EX when using Direct3D 9Ex). Values of 0 are treated as 1. If the number of back buffers cannot be created, the runtime will fail the method call and fill this value with the number of back buffers that could be created. As a result, an application can call the method twice with the same D3DPRESENT_PARAMETERS structure and expect it to work the second time.

            The method fails if one back buffer cannot be created. The value of BackBufferCount influences what set of swap effects are allowed. Specifically, any D3DSWAPEFFECT_COPY swap effect requires that there be exactly one back buffer.

            MultiSampleType
            Member of the D3DMULTISAMPLE_TYPE enumerated type. The value must be D3DMULTISAMPLE_NONE unless SwapEffect has been set to D3DSWAPEFFECT_DISCARD. Multisampling is supported only if the swap effect is D3DSWAPEFFECT_DISCARD.
            MultiSampleQuality
            Quality level. The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D9::CheckDeviceMultiSampleType. Passing a larger value returns the error D3DERR_INVALIDCALL. Paired values of render targets or of depth stencil surfaces and D3DMULTISAMPLE_TYPE must match.
            SwapEffect
            Member of the D3DSWAPEFFECT enumerated type. The runtime will guarantee the implied semantics concerning buffer swap behavior; therefore, if Windowed is TRUE and SwapEffect is set to D3DSWAPEFFECT_FLIP, the runtime will create one extra back buffer and copy whichever becomes the front buffer at presentation time.

            D3DSWAPEFFECT_COPY requires that BackBufferCount be set to 1.

            D3DSWAPEFFECT_DISCARD will be enforced in the debug runtime by filling any buffer with noise after it is presented.

            hDeviceWindow
            The device window determines the location and size of the back buffer on screen. This is used by Direct3D when the back buffer contents are copied to the front buffer during IDirect3DDevice9::Present.
            • For a full-screen application, this is a handle to the top window (which is the focus window).

              For applications that use multiple full-screen devices (such as a multimonitor system), exactly one device can use the focus window as the device window. All other devices must have unique device windows.

            • For a windowed-mode application, this handle will be the default target window for IDirect3DDevice9::Present. If this handle is NULL, the focus window will be taken.

            Note that no attempt is made by the runtime to reflect user changes in window size. The back buffer is not implicitly reset when this window is reset. However, the IDirect3DDevice9::Present method does automatically track window position changes.

            Windowed
            TRUE if the application runs windowed; FALSE if the application runs full-screen.
            EnableAutoDepthStencil
            If this value is TRUE, Direct3D will manage depth buffers for the application. The device will create a depth-stencil buffer when it is created. The depth-stencil buffer will be automatically set as the render target of the device. When the device is reset, the depth-stencil buffer will be automatically destroyed and recreated in the new size.

            If EnableAutoDepthStencil is TRUE, then AutoDepthStencilFormat must be a valid depth-stencil format.

            AutoDepthStencilFormat
            Member of the D3DFORMAT enumerated type. The format of the automatic depth-stencil surface that the device will create. This member is ignored unless EnableAutoDepthStencil is TRUE.
            Flags
            One of the D3DPRESENTFLAG constants.
            FullScreen_RefreshRateInHz
            The rate at which the display adapter refreshes the screen. The value depends on the mode in which the application is running:
            • For windowed mode, the refresh rate must be 0.
            • For full-screen mode, the refresh rate is one of the refresh rates returned by IDirect3D9::EnumAdapterModes.
            PresentationInterval
            The maximum rate at which the swap chain's back buffers can be presented to the front buffer. For a detailed explanation of the modes and the intervals that are supported, see D3DPRESENT.

             

            Direct3D程序基本結(jié)構(gòu)

            雖然Direct3D功能非常強(qiáng)大,但是Direct3D程序的基本結(jié)構(gòu)非常簡(jiǎn)單清晰,它主要有5個(gè)步驟:

            (1)創(chuàng)建一個(gè)Windows窗口。

            (2)初始化Direct3D,包括創(chuàng)建Direct3D對(duì)象、Direct3D設(shè)備對(duì)象以及要渲染的圖形對(duì)象。

            (3)消息循環(huán)。

            (4)渲染圖形。

            (5)清除在初始化時(shí)創(chuàng)建的所有COM對(duì)象,退出程序。

            其中消息循環(huán)和渲染圖形不斷進(jìn)行,如果程序有消息需要處理,則先處理消息,然后再渲染圖形;如果沒(méi)有消息處理,則一直不停地渲染圖形,直到退出Direct3D程序。

             

            最簡(jiǎn)單的Direct3D程序

            #include <d3d9.h>

            #define CLASS_NAME    "GameApp"

            #define release_com(p)    { if(p) { (p)->Release(); (p) = NULL; } }

            IDirect3D9
            *            g_d3d;
            IDirect3DDevice9
            *    g_device;

            bool init_d3d(HWND hwnd)
            {
                g_d3d 
            = Direct3DCreate9(D3D_SDK_VERSION);

                
            if(g_d3d == NULL)
                    
            return false;

                D3DPRESENT_PARAMETERS d3dpp;
                ZeroMemory(
            &d3dpp, sizeof(d3dpp));

                d3dpp.Windowed            
            = TRUE;
                d3dpp.SwapEffect        
            = D3DSWAPEFFECT_DISCARD;
                d3dpp.BackBufferFormat    
            = D3DFMT_UNKNOWN;

                
            if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                              
            &d3dpp, &g_device)))
                {
                    
            return false;
                }

                
            return true;
            }

            void cleanup()
            {
                release_com(g_device);
                release_com(g_d3d);
            }

            void render()
            {
                g_device
            ->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(4550170), 1.0f0);

                g_device
            ->BeginScene();

                
            // render game scene here 

                g_device
            ->EndScene();

                g_device
            ->Present(NULL, NULL, NULL, NULL);
            }

            LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
            {
                
            switch(msg)
                {
                
            case WM_KEYDOWN:
                    
            if(wParam == VK_ESCAPE)
                        DestroyWindow(hwnd);
                    
            break;

                
            case WM_DESTROY:        
                    PostQuitMessage(
            0);
                    
            return 0;
                }

                
            return DefWindowProc(hwnd, msg, wParam, lParam);
            }

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT)
            {
                WNDCLASSEX wc;

                wc.cbSize            
            = sizeof(WNDCLASSEX);
                wc.style            
            = CS_CLASSDC;
                wc.lpfnWndProc        
            = WinProc;
                wc.cbClsExtra        
            = 0;
                wc.cbWndExtra        
            = 0;
                wc.hInstance        
            = inst;
                wc.hIcon            
            = NULL;
                wc.hCursor            
            = NULL;
                wc.hbrBackground    
            = NULL;
                wc.lpszMenuName        
            = NULL;
                wc.lpszClassName    
            = CLASS_NAME;
                wc.hIconSm            
            = NULL;

                
            if(! RegisterClassEx(&wc))
                    
            return -1;

                HWND hwnd 
            = CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200100600500,
                                         NULL, NULL, wc.hInstance, NULL);

                
            if(hwnd == NULL)
                    
            return -1;

                
            if(init_d3d(hwnd))
                {
                    ShowWindow(hwnd, SW_SHOWDEFAULT);
                    UpdateWindow(hwnd);

                    MSG msg;
                    ZeroMemory(
            &msg, sizeof(msg));

                    
            while(msg.message != WM_QUIT)
                    {
                        
            if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
                        {
                            TranslateMessage(
            &msg);
                            DispatchMessage(
            &msg);
                        }
                        
            else
                        {
                            render();
                        }
                    }
                }

                cleanup();

                UnregisterClass(CLASS_NAME, wc.hInstance);    

                
            return 0;
            }

             

            運(yùn)行截圖:


            posted on 2008-04-29 12:57 lovedday 閱讀(2792) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: Direct3D程序設(shè)計(jì)基礎(chǔ)(1) 2008-07-19 17:58 riki

            真佩服你,你是從哪里找來(lái)那么全的資料的。我看你資料好久了。  回復(fù)  更多評(píng)論   

            # re: Direct3D程序設(shè)計(jì)基礎(chǔ)(1) 2008-08-18 05:10 lyra

            我也很佩服 人真好啊 弄這么多資料讓我們學(xué)習(xí)  回復(fù)  更多評(píng)論   


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            欧美久久久久久| 狠狠综合久久综合88亚洲| 久久夜色精品国产噜噜噜亚洲AV| 97精品伊人久久久大香线蕉| 国产精品99久久久精品无码| 久久亚洲美女精品国产精品| 久久免费小视频| 思思久久99热免费精品6| 伊人色综合久久天天人手人婷 | 久久人妻少妇嫩草AV蜜桃| 日韩精品久久久久久免费| 久久精品国产久精国产| 欧美日韩中文字幕久久久不卡| 久久精品国产久精国产果冻传媒| 久久er热视频在这里精品| 伊人色综合久久天天人守人婷| 狠狠久久亚洲欧美专区 | 亚洲中文精品久久久久久不卡| 99久久精品国产麻豆| 久久人人爽人人爽人人爽| 精品99久久aaa一级毛片| 久久精品国产亚洲av麻豆色欲 | 99久久久精品免费观看国产| 看全色黄大色大片免费久久久| 久久婷婷五月综合色奶水99啪| 合区精品久久久中文字幕一区| 久久精品视频网| 亚洲日韩中文无码久久| 亚洲一区精品伊人久久伊人| 精品人妻伦一二三区久久| 国产精品视频久久| 色欲综合久久躁天天躁蜜桃| 欧美精品国产综合久久| 亚洲国产成人精品无码久久久久久综合| 久久久久亚洲av无码专区导航| 亚洲国产综合久久天堂| 久久久久亚洲AV无码专区网站| 精品99久久aaa一级毛片| 久久福利片| 综合久久给合久久狠狠狠97色| 久久久精品国产Sm最大网站|