Direct3D interface. Grafikus játékok fejlesztése Szécsi László t04-pipecontrol

Hasonló dokumentumok
D3D, DXUT primer. Grafikus játékok fejlesztése Szécsi László t01-system

HLSL programozás. Grafikus játékok fejlesztése Szécsi László t06-hlsl

Direct3D pipeline. Grafikus játékok fejlesztése Szécsi László t03-pipeline

HLSL programozás. Szécsi László

Plakátok, részecskerendszerek. Szécsi László

Textúrák. Szécsi László

Grafikus csővezeték és az OpenGL függvénykönyvtár

OpenGL Compute Shader-ek. Valasek Gábor

Google Summer of Code OpenCL image support for the r600g driver

Farkas Gyula Szakkollégium Bit- és számtologatók. DirectX9 felhasználása számítógépes grafikában (bevezető egy primitív keretrendszer)

Számítógépes Graka - 4. Gyak

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Grafikus csővezeték (Általános áttekintés) Grafikus csővezeték (Általános áttekintés)

Párhuzamos és Grid rendszerek

Teljesítmény Mérés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Teljesítmény Mérés / 20

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor

Mesh from file, OrthoCamera, PerspectiveCamera. Szécsi László 3D Grafikus Rendszerek 3. labor

Számítógépes grafika

Pénzügyi algoritmusok

2D képszintézis. Szirmay-Kalos László

ARM Cortex magú mikrovezérlők

2. Generáció ( ) 3. Generáció (2001) NVIDIA TNT2, ATI Rage, 3dfx Voodoo3. Klár Gergely

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Bevezetés a C++ programozási nyelvbe

Grafikus csővezeték 2 / 77

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Programozási nyelvek Java

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Szoftvertechnológia alapjai Java előadások

Bevezetés a programozásba Előadás: A const

Farkas Gyula Szakkollégium Bit- és számtologatók. DirectX9 1. Szín, fény, textúra 2. Stencil buffer használata (tükörkép, hamis árnyék)

OOP #14 (referencia-elv)

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Jelszavak helyes megválasztása, szótáras törés. Pánczél Zoltán

Pénzügyi algoritmusok

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás II. 2. Dr. Iványi Péter

A szerzõrõl... xi Bevezetés... xiii

OpenCL - The open standard for parallel programming of heterogeneous systems

GPGPU. GPU-k felépítése. Valasek Gábor

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai

OOP és UML Áttekintés

OO rendszerek jellemzői

ELTE SAP Excellence Center Oktatóanyag 1

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Java II. I A Java programozási nyelv alapelemei

Autóipari beágyazott rendszerek. Komponens és rendszer integráció

A C programozási nyelv I. Bevezetés

Programozás II. 4. Dr. Iványi Péter

C++ programozási nyelv Konstruktorok-destruktorok

GPGPU. Architektúra esettanulmány

17. Többdokumentumos alkalmazások készítése..3 A többdokumentumos felület...3. A program elkészítése...27

Klár Gergely 2010/2011. tavaszi félév

Grafikus csővezeték 1 / 44

Programozás C++ -ban 2007/7

Programozási nyelvek Java

3D-s számítógépes geometria és alakzatrekonstrukció

Programozás I gyakorlat

Általános áttekintés. A módszer lényege

Körkörös listák. fej. utolsó. utolsó. fej

Java és web programozás

Bevezetés a CGI-be. 1. Történelem

Bevezetés a C++ programozási nyelvbe

Programozási nyelvek JAVA EA+GY 1. gyakolat

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Adat- és feladat párhuzamos modell Az ISO C99 szabvány részhalmaza

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Szövegek C++ -ban, a string osztály

Felhasználó által definiált adattípus

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Transzformációk. Grafikus játékok fejlesztése Szécsi László t05-transform

Mintavételes szabályozás mikrovezérlő segítségével

Python tanfolyam Python bevezető I. rész

Java II. I A Java programozási nyelv alapelemei

A C programozási nyelv I. Bevezetés

Tartalomjegyzék. Köszönetnyilvánítás... xv. Előszó... xvii. 1. Bevezető D-történelem Matematikai alapok... 7

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Bevezetés a programozásba. 9. Előadás: Rekordok

Általános áttekintés. Általános áttekintés

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

Weblog elemzés Hadoopon 1/39

Eseményvezérelt alkalmazások

ARM Cortex magú mikrovezérlők. mbed

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Kompozit alkalmazások fejlesztése. IBM WebSphere Portal Server

Videókártya - CUDA kompatibilitás: CUDA weboldal: Példaterületek:

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

SDI ALKALMAZÁS I. Workspace / ResourceView / Toolbar / IDR_MAINFRAME. Workspace / ResourceView / Menu / IDR_MAINFRAME

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

A HunPLUS 2009 újdonságai

Bevezetés a programozásba előadás: Öröklődés

Programozási Nyelvek: C++

117. AA Megoldó Alfréd AA 117.

Átírás:

Direct3D interface Grafikus játékok fejlesztése Szécsi László 2011.02.23. t04-pipecontrol

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

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;

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 jó ID3D11DeviceContext interface ID3D11DeviceContext* context;

DXUT 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

Eszköz-események létrejött [CreateDevice] 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]

További fontos események OnFrameMove paraméterként kapja: a dt időlépcsőt virtuális világ frissítése OnFrameRender paraméterként kapja: a device contextet frame bufferbe rajzolás MsgProc bármilyen windows üzenet billentyű le/fel, egérklikk, egérmozgatás,

LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR 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

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

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

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 ha valami GPU-n kiszámoltat vissza kell olvasni a rendszermemóriába (ne kelljen )

Erőforrások kötési módjai (bind) vertex buffer index buffer shader resource render target depth-stencil stream out constant buffer

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);

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);

Erőforrások felszabadítása COM objektumok referenciaszámlált createvalami növeli a referenciszá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

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

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 );

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);

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] output merger input/output szabad hozzáférésű nézet [unordered access view] pixel/compute shader input/output

Állapot-objektumok ezeket is a device metódusaival hozzuk létre és a context metódusaival kötjük be input layout ID3D11InputLayout VB elemek és VS inputok összrendelése vertex shader program pixel shader program ID3D11VertexShader ID3D11PixelShader RasterizerState, BlendState, DepthStencilState

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

Rajzolás ekkorát kell lépni a következő vertexhez 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->pssetshaderresources(0, 1, &kdsrv); innen kezdve 1 db VB elemek értelmezése context->vssetshader(vertexshader, NULL, 0); context->pssetshader(pixelshader, NULL, 0); textúranézet context->draw(3, 0); ennyi vertexet innen kezdve

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 textúrák hozzárendelésére név alapján, nem nekünk kell valamelyik textúrázó egységhez rendelni

HLSL shaderek effect fileban egy függvény szemantika pass 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 render state, shader program beállító script technique11 passok gyűjteménye

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; }

Technique, pass definíció technique11 basic { pass basic { SetVertexShader ( CompileShader( vs_5_0, vstrafo() ) ); SetPixelShader( CompileShader( ps_5_0, psbasic() ) ); } }

LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR 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

Effect interface ID3DX11Effect interface a device context feletti magasabb absztrakciós szint ugyanazt lehet vele megcsinálni, mint a device context metódusaival

Effect nélkül a shader összes paraméterét fel kell sorolni és megszámozni a HLSL kódban ID3D11DeviceContext::PSSetShaderResources paraméter: erőforrásnézetek tömbje a shader által várt sorrendben

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

LABOR LABOR LABOR LABOR LABOR LABOR LABORLABORLABOR 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 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 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