• <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>
            隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
                其實(shí)編譯器也不是不做了,只是長(zhǎng)時(shí)間連續(xù)做一個(gè)不能看的編譯器,總是有點(diǎn)不爽。因此我決定把業(yè)余的時(shí)間的主要部分花在編譯器上,而次要的部分則玩游戲,出去游樂(lè),學(xué)DirectX11。

                在我還是14歲的時(shí)候那會(huì),剛開(kāi)始學(xué)習(xí)編程不久就買(mǎi)了那本《Visual Basic高級(jí)圖形程序設(shè)計(jì)教程》,從此我走上了做圖形的道路上。后來(lái)做游戲,到了大學(xué)找不到伴,因此果斷轉(zhuǎn)做編譯器。不過(guò)每次見(jiàn)到圖形的時(shí)候心里總是有點(diǎn)癢癢的。在那之后我依然跟朋友或者自己看一些關(guān)于圖形的內(nèi)容,《GPUGems》之流的我也讀了,只不過(guò)再也沒(méi)有實(shí)踐過(guò)。后來(lái)就做了軟件渲染器,主要原因還是不想完全放棄那個(gè)東西。最近又玩了很多游戲,讓我更是想再次做一做圖形的事情。

                以前寫(xiě)了opengl,就想想現(xiàn)在還是做directx好了,于是前幾天就去下載最新的DXSDK,然后我才知道Windows7已經(jīng)內(nèi)置了DirectX11,免去了不少麻煩。所以從今天開(kāi)始決定重操舊業(yè),在做編譯器之后的閑暇時(shí)間里面,玩玩DirectX11,看看能不能搞出什么東西來(lái)。

                順便推薦一下DirectX Tutorial網(wǎng)站,DirectX的文檔還是遠(yuǎn)遠(yuǎn)沒(méi)有Win32API文檔寫(xiě)得清晰,沒(méi)有那個(gè)重要的about和using章節(jié),只有reference。所以在這個(gè)網(wǎng)站上入入門(mén)還是不錯(cuò)的。

                在這里貼一下我從那個(gè)tutorial網(wǎng)站上山寨過(guò)來(lái)的小程序。運(yùn)行結(jié)果一摸一樣,我就不貼圖了。之所以把那個(gè)破程序改成這樣,主要是因?yàn)榱?xí)慣寫(xiě)庫(kù)了,所以想把一些不太會(huì)變化的代碼抽出來(lái)坐在一起,免得以后總是要寫(xiě)。

            DirectXSetup.h
             1 #ifndef VCZH_DIRECTXSETUP
             2 #define VCZH_DIRECTXSETUP
             3 
             4 #include <D3D11.h>
             5 #include <d3dx11.h>
             6 #include <d3dx10.h>
             7 
             8 namespace vl
             9 {
            10     namespace directx
            11     {
            12         struct DirectXEnvironment
            13         {
            14             IDXGISwapChain*                    swapChain;
            15             ID3D11Device*                    device;
            16             ID3D11DeviceContext*            context;
            17             D3D_FEATURE_LEVEL                featureLevel;
            18 
            19             ID3D11RenderTargetView*            renderTargetView;
            20         };
            21         extern const DirectXEnvironment*    CreateDirectXEnvironment(HWND mainWindowHandle);
            22         extern const void                    DestroyDirectXEnvironment();
            23     }
            24 }
            25 
            26 #endif

            DirectXSetup.cpp
              1 #include "DirectXSetup.h"
              2 
              3 #if _DEBUG
              4 #define _CRTDBG_MAP_ALLOC
              5 #include <stdlib.h>
              6 #include <crtdbg.h>
              7 #endif
              8 #include <Windows.h>
              9 
             10 #pragma comment(lib, "d3d11.lib")
             11 #pragma comment(lib, "d3dx11.lib")
             12 #pragma comment(lib, "d3dx10.lib")
             13 
             14 using namespace vl;
             15 using namespace vl::directx;
             16 
             17 /***********************************************************************
             18 DirectX
             19 ***********************************************************************/
             20 
             21 HRESULT SetupDirectXEnvironment(DirectXEnvironment* env, HWND outputWindow, int clientWidth, int clientHeight)
             22 {
             23     //=========================================
             24     // define device
             25     ZeroMemory(env, sizeof(*env));
             26     DXGI_SWAP_CHAIN_DESC sd;
             27     ZeroMemory(&sd, sizeof(sd));
             28     sd.BufferCount = 1;
             29     sd.BufferDesc.Width = clientWidth;
             30     sd.BufferDesc.Height = clientHeight;
             31     sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
             32     sd.BufferDesc.RefreshRate.Numerator = 60;
             33     sd.BufferDesc.RefreshRate.Denominator = 1;
             34     sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
             35     sd.OutputWindow = outputWindow;
             36     sd.SampleDesc.Count = 1;
             37     sd.SampleDesc.Quality = 0;
             38     sd.Windowed = TRUE;
             39     
             40     //=========================================
             41     // create device
             42     D3D_FEATURE_LEVEL featureLevels = D3D_FEATURE_LEVEL_10_1;
             43     HRESULT hr = S_OK;
             44     if(FAILED(hr = D3D11CreateDeviceAndSwapChain(
             45         NULL, 
             46         D3D_DRIVER_TYPE_WARP,
             47         NULL, 
             48         0,
             49         &featureLevels, 
             50         1
             51         D3D11_SDK_VERSION, 
             52         &sd, 
             53         &env->swapChain, 
             54         &env->device, 
             55         &env->featureLevel,
             56         &env->context
             57         ))
             58     )
             59     {
             60         return hr;
             61     }
             62     
             63     //=========================================
             64     // create render target
             65     {
             66         ID3D11Texture2D* texture2DBackBuffer=0;
             67         env->swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&texture2DBackBuffer);
             68         if(FAILED(hr = env->device->CreateRenderTargetView(texture2DBackBuffer, NULL, &env->renderTargetView)))
             69             return hr;
             70         texture2DBackBuffer->Release();
             71         env->context->OMSetRenderTargets(1&env->renderTargetView, NULL);
             72     }
             73     
             74     //=========================================
             75     // set viewport
             76     {
             77         D3D11_VIEWPORT viewport;
             78         ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
             79         viewport.TopLeftX = 0;
             80         viewport.TopLeftY = 0;
             81         viewport.Width = (FLOAT)clientWidth;
             82         viewport.Height = (FLOAT)clientHeight;
             83         env->context->RSSetViewports(1&viewport);
             84     }
             85     
             86     //=========================================
             87     // succeeded
             88     return S_OK;
             89 }
             90 
             91 void ReleaseDirectXEnvironment(DirectXEnvironment* env)
             92 {
             93     env->renderTargetView->Release();
             94     env->swapChain->Release();
             95     env->device->Release();
             96     env->context->Release();
             97 }
             98 
             99 /***********************************************************************
            100 Interface
            101 ***********************************************************************/
            102 
            103 namespace vl
            104 {
            105     namespace directx
            106     {
            107         DirectXEnvironment* directXEnvironment=0;
            108 
            109         const DirectXEnvironment* CreateDirectXEnvironment(HWND mainWindowHandle)
            110         {
            111             if(!directXEnvironment)
            112             {
            113                 directXEnvironment=new DirectXEnvironment;
            114 
            115                 RECT required={0,0,0,0};
            116                 RECT bounds;
            117                 GetWindowRect(mainWindowHandle, &bounds);
            118                 AdjustWindowRect(&required, GetWindowLongPtr(mainWindowHandle, GWL_STYLE), FALSE);
            119                 int width=(bounds.right-bounds.left)-(required.right-required.left);
            120                 int height=(bounds.bottom-bounds.top)-(required.bottom-required.top);
            121 
            122                 SetupDirectXEnvironment(directXEnvironment, mainWindowHandle, width, height);
            123             }
            124             return directXEnvironment;
            125         }
            126 
            127         const void DestroyDirectXEnvironment()
            128         {
            129             if(directXEnvironment)
            130             {
            131                 ReleaseDirectXEnvironment(directXEnvironment);
            132                 delete directXEnvironment;
            133                 directXEnvironment=0;
            134             }
            135         }
            136     }
            137 }
            138 using namespace vl;
            139 using namespace vl::directx;
            140 
            141 /***********************************************************************
            142 Window
            143 ***********************************************************************/
            144 
            145 extern LRESULT CALLBACK DirectXProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool& callDefWindowProc);
            146 
            147 LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
            148 {
            149     bool callDefWindowProc=true;
            150     switch(uMsg)
            151     {
            152     case WM_DESTROY:
            153         PostQuitMessage(0);
            154         break;
            155     case WM_ERASEBKGND:
            156         callDefWindowProc=false;
            157         break;
            158     }
            159 
            160     LRESULT result=DirectXProc(hwnd, uMsg, wParam, lParam, callDefWindowProc);
            161     if(!callDefWindowProc)
            162     {
            163         return result;
            164     }
            165     return DefWindowProc(hwnd, uMsg, wParam, lParam);
            166 }
            167 
            168 BOOL CALLBACK PrimaryMonitorSelector(
            169     HMONITOR hMonitor,
            170     HDC hdcMonitor,
            171     LPRECT lprcMonitor,
            172     LPARAM dwData
            173 )
            174 {
            175     MONITORINFOEX info;
            176     info.cbSize=sizeof(MONITORINFOEX);
            177     GetMonitorInfo(hMonitor, &info);
            178     if(info.dwFlags==MONITORINFOF_PRIMARY)
            179     {
            180         HMONITOR* pMonitor=(HMONITOR*)dwData;
            181         *pMonitor=hMonitor;
            182         return FALSE;
            183     }
            184     else
            185     {
            186         return TRUE;
            187     }
            188 }
            189 
            190 void RunWindow(HINSTANCE hInstance, int clientWidth, int clientHeight)
            191 {
            192     //=========================================
            193     // global variables
            194     WNDCLASSEX windowClass;
            195     HWND mainWindowHandle;
            196 
            197     //=========================================
            198     // create class
            199     {
            200         windowClass.cbSize=sizeof(windowClass);
            201         windowClass.style=CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC;
            202         windowClass.lpfnWndProc=WndProc;
            203         windowClass.cbClsExtra=0;
            204         windowClass.cbWndExtra=0;
            205         windowClass.hInstance=hInstance;
            206         windowClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
            207         windowClass.hCursor=LoadCursor(NULL,IDC_ARROW);
            208         windowClass.hbrBackground=GetSysColorBrush(COLOR_BTNFACE);
            209         windowClass.lpszMenuName=NULL;
            210         windowClass.lpszClassName=L"VczhDirectXWindowClass";
            211         windowClass.hIconSm=NULL;
            212         RegisterClassEx(&windowClass);
            213     }
            214 
            215     //=========================================
            216     // create window
            217     {
            218         DWORD exStyle=WS_EX_APPWINDOW | WS_EX_CONTROLPARENT;
            219         DWORD style=WS_BORDER | WS_CAPTION | WS_SIZEBOX | WS_SYSMENU | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_MINIMIZEBOX;
            220         mainWindowHandle=CreateWindowEx(exStyle, windowClass.lpszClassName, L"Vczh DirectX Window", style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
            221     }
            222     
            223     //=========================================
            224     // calculate position
            225     {
            226         HMONITOR primaryMonitor=0;
            227         EnumDisplayMonitors(NULL, NULL, PrimaryMonitorSelector, (LPARAM)(&primaryMonitor));
            228         MONITORINFOEX monitorInfo;
            229         monitorInfo.cbSize=sizeof(MONITORINFOEX);
            230         GetMonitorInfo(primaryMonitor, &monitorInfo);
            231     
            232         RECT required={00, clientWidth, clientHeight};
            233         AdjustWindowRect(&required, GetWindowLongPtr(mainWindowHandle, GWL_STYLE), FALSE);
            234 
            235         int width=required.right-required.left;
            236         int height=required.bottom-required.top;
            237         int left=monitorInfo.rcWork.left+(monitorInfo.rcWork.right-monitorInfo.rcWork.left-width)/2;
            238         int top=monitorInfo.rcWork.top+(monitorInfo.rcWork.bottom-monitorInfo.rcWork.top-height)/2;
            239         MoveWindow(mainWindowHandle, left, top, width, height, TRUE);
            240     }
            241     
            242     //=========================================
            243     // run
            244     {
            245         ShowWindow(mainWindowHandle, SW_SHOWNORMAL);
            246         MSG message;
            247         while(GetMessage(&message, NULL, 00))
            248         {
            249             TranslateMessage(&message);
            250             DispatchMessage(&message);
            251         }
            252     }
            253     
            254     //=========================================
            255     // exit
            256     DestroyWindow(mainWindowHandle);
            257 }
            258 
            259 /***********************************************************************
            260 WinMain
            261 ***********************************************************************/
            262 
            263 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
            264 {
            265     RunWindow(hInstance, 800600);
            266 #if _DEBUG
            267     _CrtDumpMemoryLeaks();
            268 #endif
            269     return 0;
            270 }

            Shaders.txt
             1 struct VOut
             2 {
             3     float4 position : SV_POSITION;
             4     float4 color : COLOR;
             5 };
             6 
             7 VOut VShader(float4 position : POSITION, float4 color : COLOR)
             8 {
             9     VOut output;
            10 
            11     output.position = position;
            12     output.color = color;
            13 
            14     return output;
            15 }
            16 
            17 float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
            18 {
            19     return color;
            20 }

            Main.cpp
              1 #include "..\Shared\DirectXSetup.h"
              2 
              3 using namespace vl;
              4 using namespace vl::directx;
              5 
              6 struct VERTEX
              7 {
              8     FLOAT X, Y, Z;
              9     D3DXCOLOR Color;
             10 };
             11 
             12 struct World
             13 {
             14     const DirectXEnvironment*        env;
             15     ID3D11VertexShader*                vertexShader;
             16     ID3D11InputLayout*                vertexLayout;
             17     ID3D11PixelShader*                pixelShader;
             18     ID3D11Buffer*                    vertexBuffer;
             19 
             20     World(const DirectXEnvironment* _env)
             21         :env(_env)
             22         ,vertexShader(0)
             23         ,vertexLayout(0)
             24         ,pixelShader(0)
             25         ,vertexBuffer(0)
             26     {
             27         ID3D10Blob* vsBlob=0;
             28         ID3D10Blob* psBlob=0;
             29         D3DX11CompileFromFile(L"Shaders.txt"00"VShader""vs_4_0"000&vsBlob, 00);
             30         D3DX11CompileFromFile(L"Shaders.txt"00"PShader""ps_4_0"000&psBlob, 00);
             31         if(vsBlob)
             32         {
             33             env->device->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), NULL, &vertexShader);
             34             env->context->VSSetShader(vertexShader, 00);
             35         }
             36         if(psBlob)
             37         {
             38             env->device->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), NULL, &pixelShader);
             39             env->context->PSSetShader(pixelShader, 00);
             40         }
             41         if(vsBlob)
             42         {
             43             D3D11_INPUT_ELEMENT_DESC ied[] =
             44             {
             45                 {"POSITION"0, DXGI_FORMAT_R32G32B32_FLOAT, 00, D3D11_INPUT_PER_VERTEX_DATA, 0},
             46                 {"COLOR"0, DXGI_FORMAT_R32G32B32A32_FLOAT, 012, D3D11_INPUT_PER_VERTEX_DATA, 0},
             47             };
             48             env->device->CreateInputLayout(ied, 2, vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), &vertexLayout);
             49             env->context->IASetInputLayout(vertexLayout);
             50         }
             51 
             52         {
             53             VERTEX vertices[] =
             54             {
             55                 {0.0f0.5f0.0f, D3DXCOLOR(1.0f0.0f0.0f1.0f)},
             56                 {0.45f-0.50.0f, D3DXCOLOR(0.0f1.0f0.0f1.0f)},
             57                 {-0.45f-0.5f0.0f, D3DXCOLOR(0.0f0.0f1.0f1.0f)}
             58             };
             59 
             60             D3D11_BUFFER_DESC bd;
             61             ZeroMemory(&bd, sizeof(bd));
             62             bd.Usage = D3D11_USAGE_DYNAMIC;
             63             bd.ByteWidth = sizeof(vertices);
             64             bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
             65             bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
             66             env->device->CreateBuffer(&bd, NULL, &vertexBuffer);
             67 
             68             D3D11_MAPPED_SUBRESOURCE ms;
             69             env->context->Map(vertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
             70             memcpy(ms.pData, vertices, sizeof(vertices));
             71             env->context->Unmap(vertexBuffer, NULL);
             72         }
             73     }
             74 
             75     ~World()
             76     {
             77         if(vertexShader) vertexShader->Release();
             78         if(pixelShader) pixelShader->Release();
             79         if(vertexLayout) vertexLayout->Release();
             80         if(vertexBuffer) vertexBuffer->Release();
             81     }
             82 
             83     void Render()
             84     {
             85         env->context->ClearRenderTargetView(env->renderTargetView, D3DXCOLOR(0.0f0.2f0.4f1.0f));
             86         {
             87             UINT stride=sizeof(VERTEX);
             88             UINT offset=0;
             89             env->context->IASetVertexBuffers(01&vertexBuffer, &stride, &offset);
             90             env->context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
             91             env->context->Draw(30);
             92         }
             93         env->swapChain->Present(00);
             94     }
             95 };
             96 World* world=0;
             97 
             98 LRESULT CALLBACK DirectXProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool& callDefWindowProc)
             99 {
            100     switch(uMsg)
            101     {
            102     case WM_SHOWWINDOW:
            103         {
            104             if(wParam==TRUE)
            105             {
            106                 if(!world)
            107                 {
            108                     const DirectXEnvironment* env=CreateDirectXEnvironment(hwnd);
            109                     world=new World(env);
            110                     world->Render();
            111                 }
            112             }
            113         }
            114         break;
            115     case WM_DESTROY:
            116         {
            117             if(world)
            118             {
            119                 delete world;
            120                 world=0;
            121                 DestroyDirectXEnvironment();
            122             }
            123         }
            124         break;
            125     }
            126     return 0;
            127 }



             
            posted on 2011-07-08 08:18 陳梓瀚(vczh) 閱讀(5008) 評(píng)論(11)  編輯 收藏 引用 所屬分類(lèi): 3D

            評(píng)論:
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-08 09:07 | 千暮(zblc)
            孩子 你又手癢了  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè)[未登錄](méi) 2011-07-08 15:54 | joe
            口味還沒(méi)夠重  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-08 17:00 | 煙圈
            OpenGL 的實(shí)現(xiàn)哪里有呢。求鏈接looklook  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè)[未登錄](méi) 2011-07-08 17:30 | connor
            唉,完了完了,神一般的人物終于還是抵不了游戲的引誘,淪陷了,落敗了。。。  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-08 18:43 | 陳梓瀚(vczh)
            @connor
            誰(shuí)他媽說(shuō)神不玩游戲的,這是謠言  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-08 20:10 | lwch
            話說(shuō)QLanguage已經(jīng)停了半個(gè)多月了...  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-08 21:42 | 千暮(zblc)
            @lwch
            你應(yīng)該換個(gè)分支玩玩了,要不然到時(shí)候沒(méi)人鳥(niǎo)你  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-08 22:41 | 會(huì)員管理系統(tǒng)
            做熟悉的總歸比陌生的要好點(diǎn)  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-09 04:47 | lwch
            @千暮(zblc)
            我已經(jīng)找到地方實(shí)習(xí)了-.-  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-09 08:04 | 陳昱(CY)
            哇,這回不是offline的了,我又可以請(qǐng)教了~~  回復(fù)  更多評(píng)論
              
            # re: 暫時(shí)換換口味,重操舊業(yè) 2011-07-09 13:14 | 千暮(zblc)
            @lwch
            啥地方.........  回復(fù)  更多評(píng)論
              
            久久这里都是精品| 伊人热热久久原色播放www| 少妇高潮惨叫久久久久久| 伊人色综合久久天天人守人婷| 2021国产成人精品久久| 精品久久香蕉国产线看观看亚洲| 欧洲人妻丰满av无码久久不卡| av色综合久久天堂av色综合在| 久久久久亚洲精品日久生情| 中文字幕亚洲综合久久菠萝蜜| 婷婷久久综合| 热久久视久久精品18| 久久人人爽人人爽人人爽| 人妻无码精品久久亚瑟影视 | 精品综合久久久久久88小说 | 久久se精品一区二区影院| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲精品乱码久久久久久不卡| 久久久亚洲精品蜜桃臀| 日日狠狠久久偷偷色综合免费| 欧美精品丝袜久久久中文字幕 | 久久久久婷婷| 亚洲а∨天堂久久精品| 少妇无套内谢久久久久| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 亚洲欧美日韩精品久久亚洲区 | 亚洲国产另类久久久精品 | 精品久久久久久无码中文野结衣 | 国产福利电影一区二区三区久久久久成人精品综合| AV无码久久久久不卡网站下载 | 色88久久久久高潮综合影院| 久久99精品久久久久子伦| 亚洲国产精品久久久久婷婷软件| 国产精品免费久久久久影院| 亚洲伊人久久成综合人影院| 日韩人妻无码一区二区三区久久| 97久久精品国产精品青草| 久久久精品日本一区二区三区 | 久久精品国产亚洲AV久| 99精品国产在热久久| 久久噜噜久久久精品66|