Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Szécsi László 3D Grafikus Rendszerek 14. előadás
Direct3D Szécsi László 3D Grafikus Rendszerek 14. előadás
2
vertex data, instance data
RESOURCES PIPELINE STAGES RENDER STATES Vertex buffer Input Assembler I. input streaming Input layout Instance buffer vertex data, instance data Shader program Constant buffers and textures Vertex Shader Uniform parameters processed vertex data Input Assembler II. primitive setup Index buffer Primitive type primitive data Constant buffers and textures Shader program Geometry Shader Uniform parameters Output buffer primitive strip data Cull mode Rasterizer face culling depth bias adjustment clipping homogenous division viewport transformation output filtering Depth bias Viewport Fill mode Filtering fragments with interpolated data Constant buffers and textures Fragment Shader Shader program Uniform parameters fragment color and depth Render target textures Render target textures Render target textures Output merger stencil test depth test blending Depth-stencil state Blending state Depth-stencil texture
3
GPU pipeline input vertex bufferek index buffer rajzolási állapot
egyes pipeline-elemek működési beállításai programozható elemek shader programjai erőforrások – globális memóriában adatok globális (uniform) változók textúrák adatbufferek csak olvasható
4
GPU pipeline output kép adatbuffer read/write (GpGpu-hoz)
render target frame buffer textúra mélységbuffer (+stencil) adatbuffer stream out target read/write (GpGpu-hoz) unordered access view
5
GPU pipeline tesszellátor nélkül
IA VS IA GS RS PS OM SO +mindenki olvashatja a uniform változókat, textúrákat, buffereket
6
GPU pipeline tesszellátorral
tessfactor IA VS IA HS Tess DS GS RS PS OM tessfactor SO +mindenki olvashatja a uniform változókat, textúrákat, buffereket
7
Rajzolási állapot tessfactor IA IA Tess RS OM input layout primitive
topology rasterizer state viewport depth-stencil state blend state SO
8
semmi új --- semmi új --- semmi új
Lépések I vertexek összeállítása Vertex Shader model trafó – hol van a vertex világkoordinátában árnyalás view és proj trafó – hova esik a vertex a képernyőn primitívek összeállítása vertexek összeválogatása vertex bufferbeli sorrend alapján index bufferbeli indexek alapján semmi új --- semmi új --- semmi új
9
Lépések II tesszelláció Geometry Shader patch primitívekből
ami vezérlőpontokkal (vertexekkel) adott lineáris primitívek előállítása vonal, háromszög Geometry Shader primitívek módosítása: kb fix számú és kevés kimeneti primitív primitívek szűrése (kidobni is lehet) vertex bufferbe írás (stream out)
10
semmi új --- semmi új --- semmi új
Lépések III raszterizálás hátsólap-eldobás vágás homogén osztás viewport trafó Pixel shader pixel szín meghatározása z-teszt blending semmi új --- semmi új --- semmi új
11
Vertexek összeállítása
Vertex buffer rekordok tömbje Instance buffer hasonló tömb Minden instance rekorddal el kell küldeni minden vertex rekordot a vertex shadernek pos normal tex pos normal tex pos normal tex IA vertex
12
semmi új --- semmi új --- semmi új
Vertex shader bejövő adat uniform: model, view, proj mátrixok, fények, ... minden vertexre más: vertex és instance elemek [pozíció, normál, szín, texcoord] kimenő adat pozíció homogén normalizált képernyő koordinátákban árnyalás eredménye [szín] bármi más [normál, texcoord] semmi új --- semmi új --- semmi új VS
13
Primitívek összeállítása
non-indexed vertex bufferben egymás után következők semmi új --- semmi új --- semmi új triangle list triangle strip 1 2 3 4 5 6 1 2 3 4 5 2 5 2 4 1 3 4 6 1 5 3
14
semmi új --- semmi új --- semmi új
Indexelt primitívek Index buffer egészek tömbje Indexed primitive index bufferben egymás utáni következő indexekhez tartozó vertexek list, strip előny kényelmes nem kell strip hogy gyors legyen semmi új --- semmi új --- semmi új IA
15
semmi új --- semmi új --- semmi új
Primitívtopológiák I semmi új --- semmi új --- semmi új
16
Primitívtopológiák II
17
Primitívtopológiák III
18
Primitívtopológiák IIII
Tesszellátorhoz 1-control-point patch list … 32-control-point patch list Olyan mint a triangle list, csak nem 3 elemű Domain shaderben úgy értelmezzük őket ahogy akarjuk
19
Tesszellátor Vertexek a vezérlőpontok Hull shader Tesszellátor
vezérlőpontok módosítása tesszellációs faktorok számítása Tesszellátor legyárt egy háromszöghálót Domain shader a háromszögháló vertexeinek feltöltése adatokkal pl. pozíció számítása a vezérlőpontok súlyozásával tessfactor HS Tess DS tessfactor
20
Geometry shader Primitívek vertextömbjét kapja Primitívfolyamba írhat
elemszám topológiafüggő ha adjacenciát tartalmaz, akkor azokat is megkapja de a tesszellátor ilyen topológiát nem tud előállítani, ha van tesszellátor akkor adjacencia nincs Primitívfolyamba írhat max. elemszámot meg kell adni lassú ha ez a szám nagy GS SO
21
Folyamkimenet (Stream Out)
Geometry shader kimenete egy vertex bufferbe irányítva Pipeline többi része nem is kell hogy működjön VB később menetre köthető Pl. részecskerendszer-szimuláció részecskék a vertexek GS számítja az új pozíciójukat ping-pong a két VB között
22
Raszterizáló egység: lapeldobás
körüljárási irány (képernyőn) alapján eldobhatunk lapokat ha a modellünkben (index bufferben) konzisztens a háromszögek körüljárási iránya, ezzel eldobhatjuk a test hátsó lapjait a belsejét úgysem látjuk, ha poliéder semmi új --- semmi új --- semmi új
23
semmi új --- semmi új --- semmi új
Raszterizáció vágás homogén osztás viewport trafó: pixel koordináták lineáris interpoláció vertex output adatok (kivéve pozíció) interpolálása minden kitöltendő pixelhez pixel shader indítása minden pixelszín meghatározásához semmi új --- semmi új --- semmi új RS
24
Pixel shader bejövő adat kimenő adat
vertex shader kimenő adatai lineárisan interpolálva pixel koordináták kimenő adat pixel szín [RGBA] mélység, ha felül akarjuk írni a háromszög csúcsainak z-jéből interpolált eredetit ha nem, akkor a z-teszt előrehozható a pixel shader elé PS
25
semmi új --- semmi új --- semmi új
Kimeneti műveletek bufferek célterület (render target) frame buffer textúra mélység-stencil buffer műveletek mélység teszt stencil teszt keverés [alfa blending] semmi új --- semmi új --- semmi új OM
26
Stencil teszt a stencil buffer a z-buffer pár használatlan bitje
beállítódik valamire, ha a pixelbe rajzoltunk valamit később feltételként szabhatjuk a pixel felülírására a stencil buffer értéket pl. kirajzoljuk a tükör téglalapját, utána a tükörben látható objektumokat csak a tükör pixeleire rajzoljuk
27
Keverés [alpha blending]
A célterületen már meglevő érték [dest] és az újonnan számított szín [src] kombinálása mindkettőhöz megadható egy súly (0, 1, srcalpha, dstalpha, 1-alpha ...) megadható a függvény (add, subtract, min, max ...) átlátszóság: hátulról előre rajzolás + blending src * srcalpha + dst * (1- srcalpha)
28
A pipeline programozása
minimális példa
29
Minimális GPU pipeline
IA VS IA RS PS OM textúra cache TS globális eszközmemória konstansok adatbuffer textúra
30
Minimális rajzolási állapot
IA VS IA RS PS OM input layout primitive topology
31
A pipeline vezérlése erőforrások allokálása
vertex buffer, index buffer, textúrák rajzolási állapot beállítása ..., culling, blending, ... shader programok, uniform változók HLSL forrás alapján működés indítása draw call
32
Direct3D API - device eszköz [device]
a grafikus kártya memóriájának absztrakciója erőforrások (és más előregyártott objektumok, állapotstruktúrák, shader programok) kezelésére szolgáló felület ID3D11Device interface ID3D11Device* device;
33
Direct3D API - context kontextus [context]
a pipelineelemek állapotának absztrakciója rajzolási állapot beállítására, rajzolásra szolgáló felület alapvetően egy van belőle egy devicehoz immediate context deferred context többszálú működéshez (lenne) jó ID3D11DeviceContext interface ID3D11DeviceContext* context;
34
DXUT legacy – de a laborban Win7 van... DirectX utility toolkit
olyan mint az OpenGLhez a GLUT oprendszer funkciók elrejtése (ablaknyitás pl.) sokkal többet tud ezért bonyolultabb de a magja ugyanaz általunk írt callback függvények regisztrálása vezérlés átadása eseményekkor meghívja a mi callback függvényeinket
35
Eszköz-események létrejött [CreateDevice] új ablak [ResizedSwapChain]
program indulásakor új ablak [ResizedSwapChain] induláskor, új oprendszer-összerendeléskor (pl. átméretezés után) régi ablak eltűnik [ReleasingSwapChain] hiba esetén, az oprendszer-felület változásakor (pl. átméretezéskor) megszűnt [DestroyDevice]
36
Erőforrás-gazdálkodás
create, resized létrehozás destroy, releasing felszabadítás típusok vertex, index buffer ID3D11Buffer textúra ID3D11Texture2D cube texture, 3D texture
37
OO eseménykezelés laboron
Egg::App osztály metódusait hívják a callbackek CreateDevice → new, createResources DestroyDevice → releaseResources, delete ResizedSwapChain → setSwapChain, createSwapChainResources ReleasingSwapChain → releaseSwapChainResources FrameMove → animate FrameRender → render MsgProc → processMessage LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR
38
Állapot-objektumok ezeket is a device metódusaival hozzuk létre és a context metódusaival választjuk ki input layout ID3D11InputLayout VB elemek és VS inputok összrendelése vertex shader ID3D11VertexShader program pixel shader ID3D11PixelShader RasterizerState, BlendState, DepthStencilState
39
Erőforrástípusok ID3D11Buffer
vertex, index, instance, constant, shader resource ID3D11Texture1D, ID3D11Texture2D, ID3D11Texture3D valahány elemű tömbje a valahány mipmap-szinttel rendelkező valamilyen formátumú pixelek tömbjeinek hatelemű textúratömb = cube map
40
Erőforrás-kezelési módok (usage)
immutable létrehozáskor inicializálható, utána csak olvasható dynamic rátölthetünk új adatot akár minden frameben default nem tölthetünk rá, de szerepelhet a pipelineban mint kimenet (pl. render-to- texture) staging CPU memóriában van, átmásolható bele egy default erőforrás tartalma ha olvasni akarjuk
41
Melyik usage mikor kell?
immutable betöltött, fix dolgok, modellek, textúrák dynamic mozgó dolgok, részecskerendszerek default GPU outputként is szereplő elemek staging vészhelyzetben
42
Erőforrások kötési módjai (bind)
vertex buffer pipeline bemenet index buffer shader resource shader olvashat belőle render target kép kerülhet bele depth-stencil stream out constant buffer
43
Vertex buffer létrehozása
D3D11_BUFFER_DESC desc; desc.Usage = D3D11_USAGE_IMMUTABLE; desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; desc.ByteWidth = sizeof(D3DXVECTOR3) * 3; desc.StructureByteStride = sizeof(D3DXVECTOR3); 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; pd3dDevice->CreateBuffer( &desc, &initData, &vertexBuffer);
44
Vertex Shader létrehozása
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);
45
Input layout létrehozása
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.SemanticName = "POSITION"; positionElement.SemanticIndex = 0; pd3dDevice->CreateInputLayout( &positionElement, 1, vertexShaderByteCode->GetBufferPointer(), vertexShaderByteCode->GetBufferSize(), &inputLayout);
46
Erőforrások felszabadítása
COM objektumok referenciaszámlált createValami növeli a referenciaszámlálót ha végeztünk vele valami->Release(); csökkenti a referenciaszámlálót ha máshol sem kell már fel lesz szabadítva
47
Erőforrásnézetek vannak esetek amikor az erőforrás simán beköthető, nem kell extra info pl. vertex buffer a pipeline inputra de van amikor kell pl. textúra olvasásra – melyik szeletek, melyik mipmap szintek textúra render targetnek – melyik szelet melyik mipmap szintjére renderelünk ilyenkor létre kell hozni egy erőforrásnézetet, és azt lehet bekötni
48
Textúra és nézet D3D11_TEXTURE2D_DESC opaqueTextureDesc; //...
device->CreateTexture2D( &opaqueTextureDesc, NULL, &opaqueTexture ); D3D11_SHADER_RESOURCE_VIEW_DESC opaqueSrvDesc; opaqueSrvDesc.Format = opaqueTextureDesc.Format; opaqueSrvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; opaqueSrvDesc.Texture2D.MostDetailedMip = 0; opaqueSrvDesc.Texture2D.MipLevels = 1; device->CreateShaderResourceView( opaqueTexture, &opaqueSrvDesc, &opaqueSrv );
49
Egy lépésben fileból betöltve
a Texture2D objektum nem érdekes, mindig csak a nézetet fogjuk használni D3DX11CreateShaderResourceViewFromFile( device, L"media/giraffe.jpg", NULL, NULL, &kdSrv, NULL);
50
Erőforrásnézetek fajtái
árnyaló-erőforrásnézet [shader resource view] shader input rajzolásicél-nézet [render target view] output merger input/output mélység‒stencil-nézet [depth stencil view] szabad hozzáférésű nézet [unordered access view] pixel/compute shader input/output
51
Rajzolás OnFrameRender esemény context metódusainak hívásával
be kell állítani render target render state shaderek, uniform paraméterek textúrák vertex, index buffer draw call
52
Rajzolás unsigned int stride = sizeof(D3DXVECTOR3);
ekkorát kell lépni a következő vertexhez Rajzolás 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); innen kezdve 1 db VB elemek értelmezése ennyi vertexet innen kezdve
53
Effect framework egyszerű módszer HLSL shader kódok betöltésére
render state beállításra uniform paraméterek beállítására név alapján, nem kell nekünk kitalálni, melyik regiszterben legyen ugyanazt csinálja, mint a WebGL anyagrendszerünkben a Material.shared textúrák hozzárendelésére név alapján, nem nekünk kell valamelyik textúrázó egységhez rendelni
54
HLSL shaderek effect fileban egy függvény pass technique11 szemantika
input-output változók megcímkézhetők az input layouttal együtt megadják, melyik paraméter értéket honnan vesszük a vertex (ill. instance) bufferből pass render state, shader program beállító script technique11 passok gyűjteménye
55
HLSL shader függvény struct IaosTrafo // Input Assembler Output Struct
{ float4 pos : POSITION; }; struct VsosTrafo // Vertex Shader Output Struct float4 pos : SV_POSITION; VsosTrafo vsTrafo(IaosTrafo input) VsosTrafo output = (VsosTrafo)0; output.pos = mul(input.pos, modelViewProjMatrix); return output; }
56
Technique, pass definíció
technique11 basic { pass basic SetVertexShader ( CompileShader( vs_5_0, vsTrafo() ) ); SetPixelShader( CompileShader( ps_5_0, psBasic() ) ); }
57
Effect11 forráskódban kiadott C++ osztálykönyvtár
<dxsdk dir>/Samples/C++/Effects11 le kell fordítani magunknak be kell linkelni de bele lehet nyúlni LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR
58
Effect interface kicsit legacy, de nagyon hasznos
ID3DX11Effect interface a device context feletti magasabb absztrakciós szint ugyanazt lehet vele megcsinálni, mint a device context metódusaival
59
Effect nélkül a shader összes paraméterét fel kell sorolni és megszámozni a HLSL kódban ID3D11DeviceContext::PSSetShaderResour ces paraméter: erőforrásnézetek tömbje a shader által várt sorrendben
60
Effecttel globális változok az effect fileban
bármely shader használhatja őket beállítás név szerint effect->GetVariableByName("kdTexture")- >AsShaderResource()->SetResource(kdSrv); nem kell foglalkozni vele melyik shader melyiket használja olyan, mint a WebGL-ben Material.shared
61
Több effect file használata
sok shaderünk van, ne egy kupacon legyen de csak egy .fx-filet tölthetünk be megoldás: lesz egy main.fx, amibe beincludoljuk azokat, amik kellenek laboron: EffectInclude osztály: saját include kereső ID3DInclude interfaceből származtatható effect betöltésekor megadható "" a project folderben, <> a közös folderben keres LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR
62
Effect és médiafileok elérési útja
honnan tudjuk futásidőben, hogy mi a projektünk elérési útja? kapja meg a programunk parancssori paraméterként Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" parancssori paraméterek kezelésére Egg::SystemEnvironment osztály LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR
63
UTF8 UTF16 elvileg mindenhol Unicode stringeket használunk
wchar_t*, LPWSTR, std::wstring const wchar_t*, LPCWSTR, const std::wstring ha mégis UTF8 (char*, std::string) kell, akkor konverzió Egg::UftConverter segítségével LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.