在我还是14岁的时候那会学C++
??? 在我還是14歲的時候那會學C++,剛開始學習編程不久就買了那本《Visual Basic高級圖形程序設計教程》,從此我走上了做圖形的道路上。后來做游戲,到了大學找不到伴,因此果斷轉做編譯器。不過每次見到圖形的時候心里總是有點癢癢的。在那之后我依然跟朋友或者自己看一些關于圖形的內容,《GPUGems》之流的我也讀了,只不過再也沒有實踐過。后來就做了軟件渲染器,主要原因還是不想完全放棄那個東西。最近又玩了很多游戲,讓我更是想再次做一做圖形的事情。
??? 以前寫了opengl,就想想現在還是做directx好了,于是前幾天就去下載最新的DXSDK,然后我才知道Windows7已經內置了DirectX11,免去了不少麻煩。所以從今天開始決定重操舊業,在做編譯器之后的閑暇時間里面,玩玩DirectX11,看看能不能搞出什么東西來。
??? 順便推薦一下DirectX Tutorial網站,DirectX的文檔還是遠遠沒有Win32API文檔寫得清晰,沒有那個重要的about和using章節,只有reference。所以在這個網站上入入門還是不錯的。
??? 其實編譯器也不是不做了,只是長時間連續做一個不能看的編譯器,總是有點不爽。因此我決定把業余的時間的主要部分花在編譯器上,而次要的部分則玩游戲,出去游樂,學DirectX11。
??? 在這里貼一下我從那個tutorial網站上山寨過來的小程序。OpenEIM運行結果一摸一樣,我就不貼圖了。之所以把那個破程序改成這樣,主要是因為習慣寫庫了,所以想把一些不太會變化的代碼抽出來坐在一起,免得以后總是要寫。
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={0, 0, 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, 0, 0))
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, 800, 600);
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", 0, 0, "VShader", "vs_4_0", 0, 0, 0, &vsBlob, 0, 0);
?30???????? D3DX11CompileFromFile(L"Shaders.txt", 0, 0, "PShader", "ps_4_0", 0, 0, 0, &psBlob, 0, 0);
?31???????? if(vsBlob)
?32???????? {
?33???????????? env->device->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), NULL, &vertexShader);
?34???????????? env->context->VSSetShader(vertexShader, 0, 0);
?35???????? }
?36???????? if(psBlob)
?37???????? {
?38???????????? env->device->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), NULL, &pixelShader);
?39???????????? env->context->PSSetShader(pixelShader, 0, 0);
?40???????? }
?41???????? if(vsBlob)
?42???????? {
?43???????????? D3D11_INPUT_ELEMENT_DESC ied[] =
?44???????????? {
?45???????????????? {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
?46???????????????? {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, 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.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
?56???????????????? {0.45f, -0.5, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
?57???????????????? {-0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.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.0f, 0.2f, 0.4f, 1.0f));
?86???????? {
?87???????????? UINT stride=sizeof(VERTEX);
?88???????????? UINT offset=0;
?89???????????? env->context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
?90???????????? env->context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
?91???????????? env->context->Draw(3, 0);
?92???????? }
?93???????? env->swapChain->Present(0, 0);
?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 }
總結
以上是生活随笔為你收集整理的在我还是14岁的时候那会学C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戏说 Windows GDI (1)
- 下一篇: 【飞秋】微软简化Visual Studi