240 likes | 337 Views
GraphGame gg00 2 - Effect. Effect framework, HLSL shader László Szécsi. Effects11. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását pass : egy ilyen beállítóscript technique : pass gyűjtemény group : technique gyűjtemény
E N D
GraphGamegg002-Effect Effect framework, HLSL shader LászlóSzécsi
Effects11 • forráskódban elérhető • egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását • pass: egy ilyen beállítóscript • technique: pass gyűjtemény • group: technique gyűjtemény • erőforrások, uniform paraméterek átadása • globális változók
ID3DX11Effect interface • ID3DXEffectVariable gyűjtemény • scalar, vector, matrix • shaderResourceView (pl. textúra) • ID3DXEffectGroup • ID3DXEffectTechnique • ID3DXEffectPass • shader programok beállítása • rasterizer, blend, depthstencil állapot beállítása • mindezek egy .fxfileban • HLSL shader kódok
Effectframework beépítése a projektünkbe • 1. lehetőség • forrás lefordítása • <dxsdk dir>/Samples/C++/Effects11 • kapott lib file belinkelése • 2. lehetőség (bele akarunk hekkelni esetleg) • forrás bemásolása a GraphGame könyvtárba • project hozzáadása a GraphGamesolutionhöz
Effect11 project beépítése • copy • c:\Program Files\Microsoft DirectX SDK (June 2010)\Samples\C++\Effects11\ • GraphGame\Projects • solution/add/existing project • GraphGame/Projects/Effects11/Effects11_2010.vcxproj • delete • GraphGame/Projects/Effects11-ben • Debug, Release folder, sdf, slnfileok
Effect11 project beépítése II • project properties • Output directory és intermediatedirectory • másoljuk át a gg001-Triangle propertypageéről • Effects11 jobb klikk • build • az eredmény lib ide kerül • GraphGame/Bin/Debug/Projects/Effects11/
A gg002-Effect project létrehozása • Lehetne ugyanúgy mint ahogy a gg001-Triangle projectet létrehoztuk • de minek melózzunk kétszer • Helyette • GraphGame/Project/gg001-Triangle foldercopy/paste • gg001-Triangle – Copy átnevezése gg002-Effect-re • gg001-Triangle_2010.vcxproj átnevezése gg002-Effect_2010.vcxproj –ra • ugyanígy a .filters is
A gg002-Effect project II • solution/add exisiting project • GraphGame\Projects\gg002-Effect\gg002-Effect_2010.vcxproj • most van két gg001-Triangle :( • jobb klikk az alsón, ami nem bold • rename: gg002-Effect • utána még a cpp-t is átnevezhetjük ugyanígy
A gg002-Effect futtatása • jobb klikk/setasstartup project
Mi a terv? • Most tartunk ott ahol eddig • Ezt a projectet szeretnénk feljavítani • Hogy effectfileban adhassuk meg a shadereket • Ehhez • be kell linkelni az effectframeworkot • azt használni a kézi shaderek helyett
Projectek közötti függőség • gg002-Effect használja az Effect11 által gyártott libet • project properties/commonproperties/frameworks and references • add newreference: Effects11 • figyeljük meg, hogy link libraryreferences: true • ezért nem kell a lib-et külön beállítanunk
Effect11 include könyvtár • gg002-Effect project properties • configurationproperties/c++/additionalincludedirectories • $(SolutionDir)/Projects/Effects11/Inc
Effect fileok • hozzunk létre egy ‘fx’alkönyvtárat a gg002-Effect-en belül (ha még nincs meg) • új folder a projectkönyvtárba • új filter a solutionexplorerbe (Add New Filter) • abba egy main.fxfile • add newitem/utility/text file
#3.0 fx/main.fx float4 vsIdle(float4 pos : POSITION) : SV_Position { return pos; } float4 psIdle() : SV_Target { return float4(0, 1, 0, 1); } technique11 idle { pass idle { SetVertexShader ( CompileShader( vs_5_0, vsIdle() ) ); SetPixelShader( CompileShader( ps_5_0, psIdle() ) ); } }
#4.2 gg002-Effect.cpp #include "DXUT.h" #include "d3dx11effect.h"
#4.3 gg002-Effect.cpp ID3D11VertexShader* vertexShader; ID3D11PixelShader* pixelShader; ID3DX11Effect* effect;
#4.4 gg002-Effect.cpp 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);
#4.5 gg002-Effect.cpp pd3dDevice->CreateInputLayout(&positionElement, 1, vertexShaderByteCode->GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), &inputLayout);
#4.6 gg002-Effect.cpp 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);
#4.7 gg002-Effect.cpp // append to createDevice ID3DBlob* compiledEffect = NULL; D3DX11CompileFromFileW(L"fx/main.fx", NULL, NULL, NULL,"fx_5_0", 0, 0, NULL,&compiledEffect, NULL, NULL); D3DX11CreateEffectFromMemory(compiledEffect->GetBufferPointer(), compiledEffect->GetBufferSize(), 0, pd3dDevice, &effect);
#4.8 gg002-Effect.cpp // append to createDevice D3DX11_PASS_DESC idlePassDesc; effect->GetTechniqueByName("idle") ->GetPassByName("idle") ->GetDesc(&idlePassDesc); pd3dDevice->CreateInputLayout( &positionElement, 1, idlePassDesc.pIAInputSignature, idlePassDesc.IAInputSignatureSize, &inputLayout);
#4.9 gg002-Effect.cpp ...destroyDevice... { effect->Release(); vertexBuffer->Release(); inputLayout->Release(); vertexShader->Release(); pixelShader->Release();
#4.10 gg002-Effect.cpp context->VSSetShader(vertexShader, NULL, 0); context->PSSetShader(pixelShader, NULL, 0); effect->GetTechniqueByName("idle") ->GetPassByName("idle") ->Apply(0, context); context->Draw(3, 0);