Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- #include <d3d11.h>
- #include <d3dx11.h>
- #include <xnamath.h>
- #define SAFE_RELEASE(p) {if(p) p->Release(); p = NULL;}
- HINSTANCE g_hInstance = NULL;
- HWND g_hwnd = NULL;
- LPTSTR g_className = TEXT("ScratchDX11 Window Class");
- int g_width = 640, g_height = 480;
- ID3D11Device * g_device = NULL;
- IDXGIFactory1 * g_factory = NULL;
- IDXGIAdapter1 * g_adapter = NULL;
- IDXGIOutput * g_output = NULL;
- IDXGISwapChain * g_swapChain = NULL;
- ID3D11DeviceContext * g_deviceContext = NULL;
- ID3D11RenderTargetView * g_rtv = NULL;
- ID3D11Buffer * g_vb = NULL;
- ID3D11Buffer * g_ib = NULL;
- ID3D11Buffer * g_vertexCb = NULL;
- ID3D11VertexShader * g_vs = NULL;
- ID3D11PixelShader * g_ps = NULL;
- ID3D11InputLayout* g_il = NULL;
- HRESULT InitDevice();
- HRESULT InitGeometry();
- HRESULT InitShaders();
- void Render();
- void CleanUp();
- void ShowError(DWORD code);
- BOOL InitWindow();
- LRESULT CALLBACK MyWindowProc(HWND, UINT, WPARAM, LPARAM);
- typedef struct
- {
- XMFLOAT4 pos;
- XMFLOAT4 col;
- } SIMPLE_VERTEX;
- XMMATRIX g_mWorld;
- XMMATRIX g_mView;
- XMMATRIX g_mProjection;
- typedef struct
- {
- XMMATRIX world, view, projection;
- XMFLOAT4 data;
- } VERTEX_CB;
- HRESULT InitDevice()
- {
- HRESULT hr = S_OK;
- hr = CreateDXGIFactory1(__uuidof(g_factory), (void**)&g_factory);
- if(FAILED(hr))
- return hr;
- hr = g_factory->EnumAdapters1(0, &g_adapter);
- if(FAILED(hr))
- return hr;
- hr = g_adapter->EnumOutputs(0, &g_output);
- if(FAILED(hr))
- return hr;
- #ifdef DEBUG
- D3D11_CREATE_DEVICE_FLAG createFlags = D3D11_CREATE_DEVICE_DEBUG;
- #else
- D3D11_CREATE_DEVICE_FLAG createFlags = (D3D11_CREATE_DEVICE_FLAG)0;
- #endif
- hr = D3D11CreateDevice(
- g_adapter,
- D3D_DRIVER_TYPE_UNKNOWN,
- NULL,
- createFlags,
- NULL,
- 0,
- D3D11_SDK_VERSION,
- &g_device,
- NULL,
- &g_deviceContext);
- if(FAILED(hr))
- return hr;
- DXGI_MODE_DESC md;
- md.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- md.Width = g_width;
- md.Height = g_height;
- md.RefreshRate.Numerator = 75;
- md.RefreshRate.Denominator = 1;
- md.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
- md.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
- hr = g_output->FindClosestMatchingMode(&md, &md, g_device);
- if(FAILED(hr))
- return hr;
- DXGI_SWAP_CHAIN_DESC sd;
- SecureZeroMemory(&sd, sizeof(sd));
- sd.BufferCount=2;
- sd.BufferDesc = md;
- sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
- sd.OutputWindow = g_hwnd;
- sd.SampleDesc.Count = 4;
- sd.SampleDesc.Quality = D3D11_STANDARD_MULTISAMPLE_PATTERN;
- sd.Windowed = TRUE;
- sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
- hr = g_factory->CreateSwapChain(g_device, &sd, &g_swapChain);
- if(FAILED(hr))
- return hr;
- g_swapChain->ResizeTarget(&md);
- ID3D11Texture2D * buffer;
- hr = g_swapChain->GetBuffer(0, __uuidof(buffer), (void**)&buffer);
- if(FAILED(hr))
- return hr;
- hr = g_device->CreateRenderTargetView(buffer, NULL, &g_rtv);
- if(FAILED(hr))
- {
- buffer->Release();
- return hr;
- }
- buffer->Release();
- g_deviceContext->OMSetRenderTargets(1, &g_rtv, NULL);
- D3D11_VIEWPORT vp;
- vp.Height = (FLOAT)g_height;
- vp.Width = (FLOAT)g_width;
- vp.MinDepth = 0.0f;
- vp.MaxDepth = 1.0f;
- vp.TopLeftX = 0.0f;
- vp.TopLeftY = 0.0f;
- g_deviceContext->RSSetViewports(1, &vp);
- return hr;
- }
- HRESULT InitGeometry()
- {
- HRESULT hr = S_OK;
- SIMPLE_VERTEX vertices[] =
- {
- { XMFLOAT4(-1.0f, -1.0f, -1.0f, 1.0f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) },
- { XMFLOAT4(-1.0f, 1.0f, -1.0f, 1.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
- { XMFLOAT4( 1.0f, 1.0f, -1.0f, 1.0f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },
- { XMFLOAT4( 1.0f, -1.0f, -1.0f, 1.0f), XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f) },
- { XMFLOAT4( 1.0f, -1.0f, 1.0f, 1.0f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) },
- { XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
- { XMFLOAT4(-1.0f, 1.0f, 1.0f, 1.0f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },
- { XMFLOAT4(-1.0f, -1.0f, 1.0f, 1.0f), XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f) },
- };
- D3D11_BUFFER_DESC bd;
- SecureZeroMemory(&bd, sizeof(bd));
- bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bd.ByteWidth = sizeof(vertices);
- bd.StructureByteStride = sizeof(SIMPLE_VERTEX);
- bd.Usage = D3D11_USAGE_DEFAULT;
- D3D11_SUBRESOURCE_DATA sd;
- SecureZeroMemory(&sd, sizeof(sd));
- sd.pSysMem = vertices;
- hr = g_device->CreateBuffer(&bd, &sd, &g_vb);
- if(FAILED(hr))
- return hr;
- DWORD indices[] =
- {
- 0,1,2,
- 2,3,0,
- 4,5,6,
- 6,7,4,
- 1,6,5,
- 5,2,1,
- 3,4,7,
- 7,0,3,
- 7,6,1,
- 1,0,7,
- 3,2,5,
- 5,4,3,
- };
- bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
- bd.ByteWidth = sizeof(indices);
- bd.StructureByteStride = sizeof(DWORD);
- sd.pSysMem = indices;
- hr = g_device->CreateBuffer(&bd, &sd, &g_ib);
- if(FAILED(hr))
- return hr;
- bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- bd.ByteWidth = sizeof(VERTEX_CB);
- hr = g_device->CreateBuffer(&bd, NULL, &g_vertexCb);
- if(FAILED(hr))
- return hr;
- return hr;
- }
- HRESULT InitShaders()
- {
- HRESULT hr = S_OK;
- ID3D10Blob * bc = NULL;
- ID3D10Blob * err = NULL;
- hr = D3DX11CompileFromFile(
- TEXT("../ScratchDX11.fx"),
- NULL,
- NULL,
- "VS",
- "vs_5_0",
- 0,
- 0,
- NULL,
- &bc,
- &err,
- NULL);
- if(FAILED(hr))
- {
- if(err)
- {
- MessageBoxA(NULL, (LPSTR)err->GetBufferPointer(), "Error", MB_ICONERROR);
- err->Release();
- }
- else
- ShowError(hr);
- return hr;
- }
- hr = g_device->CreateVertexShader(bc->GetBufferPointer(), bc->GetBufferSize(), NULL, &g_vs);
- if(FAILED(hr))
- {
- ShowError(hr);
- bc->Release();
- return hr;
- }
- D3D11_INPUT_ELEMENT_DESC layout[] =
- {
- {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, sizeof(XMFLOAT4), D3D11_INPUT_PER_VERTEX_DATA, 0},
- };
- hr = g_device->CreateInputLayout(
- layout,
- sizeof(layout)/sizeof(D3D11_INPUT_ELEMENT_DESC),
- bc->GetBufferPointer(),
- bc->GetBufferSize(),
- &g_il);
- bc->Release();
- if(FAILED(hr))
- {
- ShowError(hr);
- return hr;
- }
- hr = D3DX11CompileFromFile(
- TEXT("../ScratchDX11.fx"),
- NULL,
- NULL,
- "PS",
- "ps_5_0",
- 0,
- 0,
- NULL,
- &bc,
- &err,
- NULL);
- if(FAILED(hr))
- {
- if(err)
- {
- MessageBoxA(NULL, (LPSTR)err->GetBufferPointer(), "Error", MB_ICONERROR);
- err->Release();
- }
- else
- ShowError(hr);
- return hr;
- }
- hr = g_device->CreatePixelShader(bc->GetBufferPointer(), bc->GetBufferSize(), NULL, &g_ps);
- bc->Release();
- if(FAILED(hr))
- {
- ShowError(hr);
- return hr;
- }
- return hr;
- }
- void Render()
- {
- static float clearColor[4] = {0.0f, 0.5f, 1.0f, 1.0f};
- g_deviceContext->ClearRenderTargetView(g_rtv, clearColor);
- static FLOAT t = 0.0f;
- static DWORD timeStart = 0;
- DWORD timeCur = GetTickCount();
- if(0 == timeStart)
- timeStart = timeCur;
- t = (timeCur - timeStart)/1000.0f;
- UINT vbStride = sizeof(SIMPLE_VERTEX), vbOffset = 0;
- g_deviceContext->IASetVertexBuffers(0, 1, &g_vb, &vbStride, &vbOffset);
- g_deviceContext->IASetIndexBuffer(g_ib, DXGI_FORMAT_R32_UINT, 0);
- g_deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- g_deviceContext->IASetInputLayout(g_il);
- g_mView = XMMatrixLookAtLH(XMVectorSet(0.0f, 1.0f, -5.0f, 0.0f),
- XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f),
- XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f));
- g_mProjection = XMMatrixPerspectiveFovLH(XM_PIDIV4, g_width/((FLOAT)g_height), 0.01f, 100.0f);
- g_mWorld = XMMatrixRotationRollPitchYaw(t, 0.0f, t/2);
- VERTEX_CB cb =
- {
- XMMatrixTranspose(g_mWorld),
- XMMatrixTranspose(g_mView),
- XMMatrixTranspose(g_mProjection),
- XMFLOAT4(t/2,rand()/1.0f/0x7fff,t,t)
- };
- g_deviceContext->UpdateSubresource(g_vertexCb, 0, NULL, &cb, 0, 0);
- g_deviceContext->VSSetConstantBuffers(0, 1, &g_vertexCb);
- g_deviceContext->VSSetShader(g_vs, NULL, 0);
- g_deviceContext->PSSetShader(g_ps, NULL, 0);
- g_deviceContext->DrawIndexed(36, 0, 0);
- g_swapChain->Present(0, 0);
- }
- void CleanUp()
- {
- if(g_deviceContext)
- g_deviceContext->ClearState();
- SAFE_RELEASE(g_factory);
- SAFE_RELEASE(g_adapter);
- SAFE_RELEASE(g_output);
- SAFE_RELEASE(g_vs);
- SAFE_RELEASE(g_ps);
- SAFE_RELEASE(g_vertexCb);
- SAFE_RELEASE(g_il);
- SAFE_RELEASE(g_vb);
- SAFE_RELEASE(g_ib);
- SAFE_RELEASE(g_rtv);
- SAFE_RELEASE(g_device);
- SAFE_RELEASE(g_swapChain);
- SAFE_RELEASE(g_deviceContext);
- }
- void ShowError(DWORD code)
- {
- LPWSTR buffer = NULL;
- if(!FormatMessageW(
- FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- code,
- 0,
- (LPWSTR)&buffer,
- 0,
- NULL) ||
- !buffer)
- {
- buffer = (LPWSTR)LocalAlloc(0, 150*sizeof(WCHAR));
- swprintf_s(buffer, 150, L"Unidentified error: %08X(%I32u)", code);
- }
- MessageBoxW(NULL, buffer, L"Error", MB_ICONERROR);
- LocalFree(buffer);
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline, int nCmdShow)
- {
- g_hInstance = hInstance;
- if(!InitWindow())
- {
- ShowError(GetLastError());
- return 1;
- }
- ShowWindow(g_hwnd, nCmdShow);
- UpdateWindow(g_hwnd);
- HRESULT hr;
- if(FAILED(hr = InitDevice()))
- {
- ShowError(hr);
- CleanUp();
- return 1;
- }
- if(FAILED(hr = InitGeometry()))
- {
- ShowError(hr);
- CleanUp();
- return 1;
- }
- if(FAILED(hr = InitShaders()))
- {
- CleanUp();
- return 1;
- }
- MSG msg;
- do
- {
- if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- {
- Render();
- }
- } while(msg.message != WM_QUIT);
- CleanUp();
- return 0;
- }
- BOOL InitWindow()
- {
- WNDCLASSEX wc;
- SecureZeroMemory(&wc, sizeof(wc));
- wc.cbSize = sizeof(wc);
- wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hInstance = g_hInstance;
- wc.lpfnWndProc = MyWindowProc;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpszClassName = g_className;
- if(INVALID_ATOM == RegisterClassEx(&wc))
- return FALSE;
- if(!(g_hwnd = CreateWindow(
- g_className,
- TEXT("DX11"),
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- g_width,
- g_height,
- NULL,
- NULL,
- g_hInstance,
- NULL)))
- return FALSE;
- return TRUE;
- }
- LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_SIZE:
- {
- g_width = LOWORD(lParam);
- g_height = HIWORD(lParam);
- if(!g_swapChain || !g_device || !g_rtv)
- break;
- DXGI_SWAP_CHAIN_DESC sd;
- g_swapChain->GetDesc(&sd);
- sd.BufferDesc.Height = g_height;
- sd.BufferDesc.Width = g_width;
- g_rtv->Release();
- g_deviceContext->ClearState();
- g_swapChain->ResizeBuffers(sd.BufferCount, (UINT)g_width, (UINT)g_height, sd.BufferDesc.Format, sd.Flags);
- ID3D11Texture2D * buffer;
- g_swapChain->GetBuffer(0, __uuidof(buffer), (void**)&buffer);
- g_device->CreateRenderTargetView(buffer, NULL, &g_rtv);
- buffer->Release();
- g_deviceContext->OMSetRenderTargets(1, &g_rtv, NULL);
- D3D11_VIEWPORT vp;
- vp.Height = (FLOAT)g_height;
- vp.Width = (FLOAT)g_width;
- vp.MinDepth = 0.0f;
- vp.MaxDepth = 1.0f;
- vp.TopLeftX = 0.0f;
- vp.TopLeftY = 0.0f;
- g_deviceContext->RSSetViewports(1, &vp);
- }
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- BeginPaint(hwnd, &ps);
- EndPaint(hwnd, &ps);
- }
- break;
- case WM_KEYDOWN:
- switch(wParam)
- {
- case VK_ESCAPE:
- PostQuitMessage(0);
- return 0;
- default:
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement