#include #include #include #include #include #pragma comment (lib, "d3d10.lib") #pragma comment (lib, "d3dx10.lib") #pragma comment (lib, "DXGI.lib") ID3D10Device* d3ddev = NULL; IDXGISwapChain* swChain; ID3D10RenderTargetView* renderTargetView; HWND hWnd; D3D10_VIEWPORT viewPort; ID3D10Texture2D *texture; D3DX10_SPRITE testSprite; D3D10_TEXTURE2D_DESC desc; D3D10_SHADER_RESOURCE_VIEW_DESC SRVdesc; ID3D10ShaderResourceView *spriteRV; ID3DX10Sprite *ObjSprite; D3DXMATRIX matProjection, matTranslation, matScalation; void loadresource(void); void initD3D(HWND hWnd); void render_frame(void); void cleanD3D(void); LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "WindowClass"; RegisterClassEx(&wc); RECT r={0,0,800,600}; AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE); hWnd = CreateWindowEx(NULL, "WindowClass", "Direct3D 10", WS_OVERLAPPEDWINDOW, 150, 150, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); initD3D(hWnd); MSG msg; while(TRUE) { while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } if(msg.message == WM_QUIT) break; render_frame(); } cleanD3D(); return msg.wParam; } LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } break; } return DefWindowProc (hWnd, message, wParam, lParam); } void initD3D(HWND hWnd) { DXGI_SWAP_CHAIN_DESC swChainDesc; ZeroMemory(&swChainDesc, sizeof(swChainDesc)); swChainDesc.BufferDesc.Height = 600; swChainDesc.BufferDesc.Width = 800; swChainDesc.BufferDesc.RefreshRate.Numerator = 60; swChainDesc.BufferDesc.RefreshRate.Denominator = 1; swChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; swChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; swChainDesc.SampleDesc.Count = 1; swChainDesc.SampleDesc.Quality = 0; swChainDesc.OutputWindow = hWnd; swChainDesc.BufferCount = 1; swChainDesc.Windowed = TRUE; swChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; swChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_NONPREROTATED; swChainDesc.Flags = 0; D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &swChainDesc, &swChain, &d3ddev); ID3D10Texture2D *backBuffer; swChain->GetBuffer( 0, __uuidof( ID3D10Texture2D ), (LPVOID*)&backBuffer ); HRESULT hr = d3ddev->CreateRenderTargetView( backBuffer, NULL, &renderTargetView ); backBuffer->Release(); d3ddev->OMSetRenderTargets(1, &renderTargetView,NULL); ZeroMemory(&viewPort,sizeof(viewPort)); viewPort.Width = 800; viewPort.Height = 600; viewPort.MaxDepth = 1; viewPort.MinDepth = 0; viewPort.TopLeftX = 0; viewPort.TopLeftY = 0; d3ddev->RSSetViewports(1, &viewPort); loadresource(); } void render_frame(void) { D3DXMatrixOrthoOffCenterLH(&matProjection, (float)viewPort.TopLeftX,(float)viewPort.Width, (float)viewPort.TopLeftY, (float)viewPort.Height, 0.1f, 10); ObjSprite->SetProjectionTransform(&matProjection); D3DXMatrixTranslation(&matTranslation, 200.f,viewPort.Height - 200.f, 0.1f); D3DXMatrixScaling(&matScalation, 60,60,1.0f); testSprite.matWorld = (matTranslation*matScalation); d3ddev->ClearRenderTargetView(renderTargetView, D3DXCOLOR(0.0f,0.125f,0.6f,0.0f)); ObjSprite->Begin(D3DX10_SPRITE_SORT_TEXTURE); //ObjSprite->DrawSpritesImmediate(&testSprite,1,0,0); ObjSprite->DrawSpritesBuffered(&testSprite,1); ObjSprite->Flush(); ObjSprite->End(); swChain->Present(0,0); } void cleanD3D(void) { renderTargetView->Release(); swChain->Release(); ObjSprite->Release(); d3ddev->Release(); }//* void loadresource() { ID3D10Resource* pRes; HRESULT hr = D3DX10CreateTextureFromFile(d3ddev,"sprite.bmp", NULL, NULL, &pRes, NULL); if(FAILED(hr)) { MessageBox(hWnd, "Texture Load Failed","Message",MB_OK); } pRes->QueryInterface(__uuidof(ID3D10Texture2D), (LPVOID*)&texture); pRes->Release(); texture->GetDesc(&desc); ZeroMemory(&SRVdesc, sizeof(SRVdesc)); SRVdesc.Format = desc.Format; SRVdesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D; SRVdesc.Texture2D.MipLevels = desc.MipLevels; d3ddev->CreateShaderResourceView(texture, &SRVdesc, &spriteRV); testSprite.pTexture = spriteRV; testSprite.TexCoord.x = 0; testSprite.TexCoord.y = 0; testSprite.TexSize.x = 1.0f; testSprite.TexSize.y = 1.0f; testSprite.TextureIndex=0; testSprite.ColorModulate=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f); hr = D3DX10CreateSprite(d3ddev,0,&ObjSprite); if(FAILED(hr)) { MessageBox(hWnd, "Create Sprite Failed","Message",MB_OK); } }