Easy Implementation of Shader Effects Framework
Learn to simplify shader translation and drawing state setup with Effect framework in HLSL shader code. Manage resources, pass uniform parameters, and set up shader programs in a single .fx file. Integrate Effect framework in your project effortlessly.
Easy Implementation of Shader Effects Framework
E N D
Presentation Transcript
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);