GraphGame gg001-Triangle Visual Studio, háromszög rajzolása Szécsi László
Direct3D11 SDK June 2010 DirectX SDK Visual Studio 2010
Könyvtár-hierarchia GraphGame – solution folder Projects – ide gyűjtjük a projecteket (csak forrás) gg001-Triangle – ez például egy project folder lesz gg002-Effect – ez is fx – ebben lesz majd a projecthez tartozó shader kód Build – ide dolgozik majd a Visual Studio Debug – ide ha debugba fordítunk gg001-Triangle – minden projectnek lesz alkönyvtára Release – ide ha releasebe gg001-Triangle – itt is Bin – ide kerülnek a futtathatók (ugyanaz a hierarchia)
Könyvtár-hierarchia II. GraphGame – solution folder Media – ide kerülnek a projectek közös modell, textúra, stb filejai fx – ide kerülnek a közös effect fileok, shaderek
Solution gyártása Visual Studio/Project/New Project… name: Dontcare solution name: GraphGame Solution explorerben: Dontcare jobbklikk/remove Törülhetjük az egész Dontcare foldert Van egy üres solutionünk
Folderek A GraphGame folderben hozzuk létre a következő foldereket Projects (ez a fontos) Media (projectek közös modelljei, textúrái) fx (projectek közös shader kódja) Bin (bináris exe, lib) Build (ideiglenes fileok)
DX Empty project Start Menu/DirectX SDK (June 2010)/DirectX Sample Browser install EmptyProject11 a GraphGame/Projects folderbe project neve: gg001-Triangle nem kellenek az sln fileok, törölhetők nem kell a vs2008-as projectfile, törölhető
Project berakása a solutionbe VS-ban solutionexplorer/jobb klikk/add existing project válasszuk ki az előbb felrakott projectfilet (2010-eset)
Könyvtárbeállítások solution explorer/jobbklikk a projecten/project properties/general output directory $(ProjectDir.Replace($(SolutionDir),$(SolutionDir)Bin\$(Configuration)\)) intermediate directory $(ProjectDir.Replace($(SolutionDir),$(SolutionDir)Build\$(Configuration)\)) project properties/debugging/working dir $(SolutionDir)
Fordítás A megfelelő könyvtárakba szemetel Így könnyű pl. csak a forrást összezippelni
DirectX 9 támogatás kidobása delete EmptyProject9.cpp minden D3D9-et tartalmazó sor törlése a gg001-Triangle.cpp-ből
Include és lib könyvtárak beállítása project properties (ez csak erre a projectre lesz érvényes) Configuration properties/c/c++/general/additional include directories C:\Program Files\Microsoft DirectX SDK (June 2010)\Include Configuration properties/linker/general/additional library directories C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x86
Include és lib könyvtárak beállítása gép alapon (minden projectre érvényes lesz) view menu: property manager property manager ablakban pl. Debug | Win32 Microsoft.Cpp.Win32.User duplaklikk VC++ directories alá az előző diákon szereplő könyvtárak beállítása
Itt tartunk – üres ablak
g001-Triangle.cpp globális callback függvények eszközesemények OnD3D11CreateDevice program indul OnD3D11ResizedSwapChain ablak létrejött OnD3D11ReleasingSwapChain ablak megszűnt OnD3D11DestroyDevice program vége vezérlési események OnD3D11FrameRender rajzolás OnFrameMove animáció MsgProc windows üzenet
Háromszög rajzolása erőforrás létrehozás/felszabadítás (vertex buffer), render target törlés, rajzolás
Ezekre lesz szükség vertex buffer = [x, y, z] [x, y, z] [x, y, z, 1] IA VS IA RS PS OM [x, y, z, 1] [x, y, z, 1] input layout vertex shader primitive topology marad default pixel shader marad default
gg001-Triangle.cpp #2.5 // global variables ID3D11Buffer* vertexBuffer; ID3D11InputLayout* inputLayout; ID3D11VertexShader* vertexShader; ID3D11PixelShader* pixelShader;
gg001-Triangle.cpp #2.6 ... OnD3D11CreateDevice ... { D3D11_BUFFER_DESC desc; desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; desc.ByteWidth = sizeof(D3DXVECTOR3) * 3; desc.CPUAccessFlags = 0; desc.MiscFlags = 0; desc.StructureByteStride = sizeof(D3DXVECTOR3); desc.Usage = D3D11_USAGE_IMMUTABLE; D3DXVECTOR3 vertexPositionArray[3] = { D3DXVECTOR3(0, 0, 0.5), D3DXVECTOR3(0, 1, 0.5), D3DXVECTOR3(1, 0, 0.5) }; D3D11_SUBRESOURCE_DATA initData; initData.pSysMem = vertexPositionArray; initData.SysMemPitch = 0; initData.SysMemSlicePitch = 0; pd3dDevice->CreateBuffer(&desc, &initData, &vertexBuffer);
#2.7 gg001-Triangle.cpp pd3dDevice->CreateBuffer(&desc, &initData, &vertexBuffer); const char* vertexShaderCode = "float4 vsIdle(float4 pos :POSITION ) :SV_Position {return pos;}"; ID3DBlob* vertexShaderByteCode; D3DX11CompileFromMemory(vertexShaderCode, strlen(vertexShaderCode), NULL, NULL, NULL, "vsIdle", "vs_5_0", 0, 0, NULL, &vertexShaderByteCode, NULL, NULL); pd3dDevice->CreateVertexShader( vertexShaderByteCode->GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), NULL, &vertexShader);
gg001-Triangle.cpp #2.8 // insert after #2.7 D3D11_INPUT_ELEMENT_DESC positionElement; positionElement.AlignedByteOffset = 0; positionElement.Format = DXGI_FORMAT_R32G32B32_FLOAT; positionElement.InputSlot = 0; positionElement.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; positionElement.InstanceDataStepRate = 0; positionElement.SemanticIndex = 0; positionElement.SemanticName = "POSITION";
gg001-Triangle.cpp #2.9 // insert after #2.8 pd3dDevice->CreateInputLayout( &positionElement, 1, vertexShaderByteCode ->GetBufferPointer(), vertexShaderByteCode ->GetBufferSize(), &inputLayout);
gg001-Triangle.cpp #2.10 // insert after #2.9 const char* pixelShaderCode = "float4 psIdle() : SV_Target {return float4(1, 0, 0, 1);}"; ID3DBlob* pixelShaderByteCode; D3DX11CompileFromMemory(pixelShaderCode, strlen(pixelShaderCode), NULL, NULL, NULL, "psIdle", "ps_5_0", 0, 0, NULL, &pixelShaderByteCode, NULL, NULL); pd3dDevice-> CreatePixelShader( pixelShaderByteCode->GetBufferPointer(), pixelShaderByteCode->GetBufferSize(), NULL, &pixelShader);
gg001-Triangle.cpp #2.11 ...OnD3D11DestroyDevice... { vertexBuffer->Release(); inputLayout->Release(); vertexShader->Release(); pixelShader->Release(); }
gg001-Triangle.cpp #2.12 ...OnD3D11FrameRender... { ID3D11DeviceContext* context = pd3dImmediateContext; float clearColor[4] = { 0.9f, 0.7f, 0.1f, 0.0f }; ID3D11RenderTargetView* defaultRtv = DXUTGetD3D11RenderTargetView(); ID3D11DepthStencilView* defaultDsv = DXUTGetD3D11DepthStencilView(); context->ClearRenderTargetView( defaultRtv, clearColor ); context->ClearDepthStencilView( defaultDsv, D3D11_CLEAR_DEPTH, 1.0, 0 );
gg001-Triangle.cpp #2.13 // insert after #2.12 unsigned int stride = sizeof(D3DXVECTOR3); unsigned int offset = 0; context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); context->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); context->IASetInputLayout(inputLayout); context->VSSetShader(vertexShader, NULL, 0); context->PSSetShader(pixelShader, NULL, 0); context->Draw(3, 0);
Háromszög kész
Honnan tudjuk mit kell csinálni? Start menu doc
Visual Studio 2010 tippek bepastelt kódhoz: általában kódoláshoz formáz: kijelöl, Ctrl+K, Ctrl+F általában kódoláshoz kódieg.: eleje begépel, aztán Ctrl+space metódus paraméterlistája kurzor a zárójelek közé v. nyitó zárójel után ctrl+alt+space