Direct3D DirectCompute

Slides:



Advertisements
Hasonló előadás
GraphGame gg001-Triangle
Advertisements

Programozás III KOLLEKCIÓK 2..
Lua script Szécsi László
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
Mesh betöltés, kirajzolás Szécsi László. dx11-ben nincs – játékfejlesztők írnak maguknak úgyis DXUT-ban van – CDXUTSDKMesh – csak sdkmesh formátumot tud.
Dinamikus tömbök.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
5. előadás (2005. március 22.) Függvények definíciója, deklarációja, hívása Enumerációs adattípus 1.
Fájlkezelés, IO Kivételkezelés Belső osztályok
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Annotációk a Java 5 nyelvben Kozsik Tamás. Annotációk Módosítószavak bővítése A programszöveg elemeihez rendelhetők –Csomagokhoz, típusokhoz, metódusokhoz,
Edényrendezés - RADIX „vissza” - bináris számokra
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
Tömbök Csernoch Mária.
Számítógépes grafika 3. gyakorlat.
2008/2009 tavasz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál 
2008/2009 tavasz Klár Gergely  Gyakorlatok időpontjai: ◦ Szerda 10:05–11:35 ◦ Csütörtök 10:00+ε –11:30+ε  Gyakvez: ◦ Klár Gergely ◦
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Félévi típus feladatok
Tömbök és programozási tételek
DirectX9 empty project Szécsi László. Visual Studio Első indításkor C++ választása.
Motor I. Scene graph XML Rendering Szécsi László.
Environment mapping Szécsi László. Új osztály: Lab3EnvMap copy&paste: Lab2Trafo.h -> Lab3EnvMap.h copy&paste: Lab2Trafo.cpp -> Lab3EnvMap.cpp copy&paste:
Rendering pipeline Ogre3D
Kezdeti teendők Letöltés: CharacterModellingBase.zip Blender3D futtatása headBase.blend betöltése.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
Megjelenítő-motor, színtér- menedzsment Szécsi László.
Effect framework, HLSL shader László Szécsi. 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.
Többmenetes renderelés Grafikus játékok fejlesztése Szécsi László g11-multipass.
Grafikus játékok fejlesztése Szécsi László t09-texture
OO framework, Egg util library László Szécsi. Projektek nem osztoznak semmilyen kódon – DXUT mindegyikben – effect betöltés, mesh betöltés, GUI mindegyikbe.
Rendszám Felismerő Rendszer Fajt Péter Vácz István
OpenGL 4 shaderek, GLSL Valasek Gábor
GPGPU A grafikus hardver általános célú felhasználása
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
CUDA C/C++ programozás Szál struktúra A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
CUDA C/C++ programozás Egyéb eszköztárak vegyesen A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt.
CUDA C/C++ programozás
CUDA C/C++ programozás CUDA C bevezetés A segédanyag készítése a TÁMOP A/ Nemzeti Kiválóság Program című kiemelt projekt keretében.
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
Számítógépes grafika gyakorlat: DirectX 2007/2008 tavasz Klár Gergely
Számítógépes Grafika OpenGL 4 shaderek, GLSL. OpenGL 4 A következő programozható fázisok vannak a 4.x-es OpenGL-ben: Vertex shader Tesselation control.
Képek, képfeldolgozás Szirmay-Kalos László.
Vizualizáció és képszintézis Térfogati textúrák kezelése (Dart + GLSL) Szécsi László.
Szécsi László 3D Grafikus Rendszerek 15. előadás
GPGPU – CUDA 1..
Neumann János Informatikai Kar
Neumann János Informatikai Kar
a programegységek között
A grafikus hardware programozása
OpenGL 2. gyakorlat Valasek Gábor
„Designer-barát” játéklogika
Vizualizáció és képszintézis
Vizualizáció és képszintézis
Szécsi László 3D Grafikus Rendszerek 14. előadás
Vizualizáció és képszintézis
GPGPU – CUDA 2..
gg004-Mesh project copy-paste-rename gg002-App folder
Kamera, 3D, transzformációk Szécsi László
OpenGL II.
Material+ kioptimalizált uniformok
Nikházy László Ureczky Bálint Konzulens: dr. Horváth Gábor
Sw2 PhysX.
JavaScript a böngészőben
OO framework, Egg util library László Szécsi
GraphGame gg001-Triangle
Environment mapping Szécsi László
Programozási tételek.
CUDA – OpenGL.
Előadás másolata:

Direct3D DirectCompute Szécsi László 3D Grafikus Rendszerek 5. labor

Keret Visual Studio 2015 project DirectXTex Egg lib modulok App – alapinfrastuktúra, App osztály eseménykezelő metódusokkal Cam – kamera Enum – típusbiztos enum és flag kezelés Math – vektor- és mátrixműveletek, pl. float3, float4x4 Mesh – geometria- és anyagrendszer AssImp modellfile-betöltővel

gr005-ToneMap project Game osztály eseménykezelő metódusok egy 3D objektum Egg::Mesh::ShadedP shadedMesh – ugyanaz mint a WebGL-ben a Mesh volt kirajzoláshoz trafók beállítása kézzel perObjectConstantBuffer, perFrameConstantBuffer feltöltése GameObject nincs a keretben (így is elég nagy, nemhogy még színtérkezeléssel) háttér quad ugyanaz minden, mint WebGL-ben volt shaderek trafo.hlsli, vsTrafo.hlsl, fsEnvMapped.hlsl quad.hlsli, vsQuad.hlsl, fsBackground.hlsl

Hova dolgozunk? új erőforrások a Game.h-ba tagváltozóként létrehozásuk/felszabadításuk a Game.cpp megfelelő eseményfigyelőiben használatuk rajzoláshoz a Game::render-ben shaderek a Shaders folderbe properties-ben állítsuk be a shader típusát

Munkaterv tone mapping manuálisan textúrába renderelés legyen egy per-frame shader konstans (uniform) szorzó gombnyomással változtatható textúrába renderelés 128x128-as textúra létrehozása usage: render target és shader resource RTV és SVR nézetobjektumok létrehozása színtér rajzolása a textúrába render target ellenőrzése: kész textúra megjelenítése compute shaderrel a 128x128 pixel átlagolása tone mapping az átlag alapján extra

Manuális tone mapping új elem a perFrame-ben: float4 toneScale createResources-ban buffer méretét módosítani psEnvMapped és psBackground shaderekben a kimenet szorzása toneScale.x-lel Game-ben float toneScale tagváltozó Game::processMessage-ben változtatható uMsg == WM_KEYDOWN wParam == 'G': toneScale *= 0.8f wParam == 'T': toneScale *= 1.25f render-ben a konstant buffer feltöltésének kiegészítése

Várt eredmény

Erőforrás-pointerek Microsoft::WRL::ComPtr<ID3D11Texture2D> sampleTexture; Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> sampleSrv; Microsoft::WRL::ComPtr<ID3D11RenderTargetView> sampleRtv; sampleDepthTexture; Microsoft::WRL::ComPtr<ID3D11DepthStencilView> sampleDsv;

Erőforrások létrehozása - sampleTexture CD3D11_TEXTURE2D_DESC sampleTextureDesc( DXGI_FORMAT_R32G32B32A32_FLOAT, 128, 128); sampleTextureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; sampleTextureDesc.MipLevels = 1; device->CreateTexture2D( &sampleTextureDesc, NULL, sampleTexture.GetAddressOf());

Erőforrások létrehozása - sampleRtv CD3D11_RENDER_TARGET_VIEW_DESC sampleRtvDesc; sampleRtvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; sampleRtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; sampleRtvDesc.Texture2D.MipSlice = 0; device->CreateRenderTargetView( sampleTexture.Get(), &sampleRtvDesc, sampleRtv.GetAddressOf());

Erőforrások létrehozása - sampleSrv CD3D11_SHADER_RESOURCE_VIEW_DESC sampleSrvDesc; sampleSrvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; sampleSrvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; sampleSrvDesc.Texture2D.MipLevels = 1; sampleSrvDesc.Texture2D.MostDetailedMip = 0; device->CreateShaderResourceView( sampleTexture.Get(), &sampleSrvDesc, sampleSrv.GetAddressOf());

Erőforrások létrehozása - sampleDepthTexture CD3D11_TEXTURE2D_DESC sampleDepthTextureDesc( DXGI_FORMAT_D24_UNORM_S8_UINT, 128, 128); sampleDepthTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; sampleDepthTextureDesc.MipLevels = 1; HRESULT hr = device->CreateTexture2D( &sampleDepthTextureDesc, NULL, sampleDepthTexture.GetAddressOf());

Erőforrások létrehozása - sampleDsv CD3D11_DEPTH_STENCIL_VIEW_DESC sampleDsvDesc; sampleDsvDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; sampleDsvDesc.Flags = 0; sampleDsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; sampleDsvDesc.Texture2D.MipSlice = 0; device->CreateDepthStencilView( sampleDepthTexture.Get(), &sampleDsvDesc, sampleDsv.GetAddressOf());

Erőforrások felszabadítása mindegyikre: .Reset(); nullázza a pointert, elveszíti a referenciát

Rajzoljuk a hátteret + zsiráfot a textúrába render target váltás (lásd köv. dia) rtv/dsv törlés dolgok rajzolása render target visszaállítás default rtv/dsv törlés ide is rajzolhatjuk a színteret a render target textúra megmutatása is ide kerülhet

Render target váltás context->OMSetRenderTargets( 1, sampleRtv.GetAddressOf(), sampleDsv.Get()); D3D11_VIEWPORT vp; vp.TopLeftX = 0; vp.TopLeftY = 0; vp.Height = 128; vp.Width = 128; vp.MinDepth = 0; vp.MaxDepth = 1; context->RSSetViewports(1, &vp);

Render target visszaállítás context->OMSetRenderTargets( 1, defaultRenderTargetView.GetAddressOf(), defaultDepthStencilView.Get()); vp.TopLeftX = 0; vp.TopLeftY = 0; vp.Height = swapChainDesc.Height; vp.Width = swapChainDesc.Width; vp.MinDepth = 0; vp.MaxDepth = 1; context->RSSetViewports(1, &vp);

Render texture megmutatása teljes képernyős quad új pixel shaderrel backgroundMesh mintájára: showMesh új PS, showMaterial gyártása belőle, inputBinder-rel inputLayout kérése, shaded mesh létrehozása psShow.hlsl quad input mint a psBackground-ban 2D textúrából olvas, input.tex koordinátákkal az anyagnak a 2d textúra sample SRV-t beállítani (lásd köv dia)

Textúra SRV bekötése showMaterial->setShaderResource( "showTexture", sampleSrv);

Minden kikötése (hogy ne sírjon) context->ClearState();

Várt eredmény (128x128)

Jöhet a compute koncepció: 1. menet 2. menet végül extra Jöhet a compute koncepció: 1. menet minden szálcsoport egy sort ad össze a képből 128 szálcsoportot indítunk, 64 szál per csoport minden szálcsoport első szála a végén kiírja az eredményt egy output buffer megfelelő elemébe 2. menet egyetlen szálcsoportot indítunk, aki összeadja az 128 számot végül a kapott számmal osztunk a megjelenítéskor

Összeadás algoritmusa minden szál beolvas két adatot, összeadja, shared tömbbe tárolja szinkronizáció, megvárjuk, hogy bejöjjön az adat ezután a második felét hozzáadjuk az első feléhez már csak 32 szál végez értelmes munkát aztán ezt ismételjük feleakkora méretben szinkronizáció nem kell, mert az összes szál egy warpben van (egyszerre hajtódnak végre ténylegesen) a végén a shared memória nulladik eleme az összeg

Buffer, UAV pointerek, shaderek Microsoft::WRL::ComPtr<ID3D11Buffer> reduceBuffer1; Microsoft::WRL::ComPtr<ID3D11UnorderedAccessView> reduceUav1; reduceBuffer2; reduceUav2; Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> reduceSrv2; Egg::Mesh::ShaderP csReduceHorizontal; Egg::Mesh::ShaderP csReduceVertical;

Bufferek, UAVok létrehozása CD3D11_BUFFER_DESC reduceBuffer1Desc(sizeof(float) * 128, D3D11_BIND_UNORDERED_ACCESS); device->CreateBuffer(&reduceBuffer1Desc, NULL, reduceBuffer1.GetAddressOf()); CD3D11_UNORDERED_ACCESS_VIEW_DESC reduceUav1Desc(D3D11_UAV_DIMENSION_BUFFER, DXGI_FORMAT_R32_FLOAT, 0, 128); device->CreateUnorderedAccessView( reduceBuffer1.Get(), &reduceUav1Desc, reduceUav1.GetAddressOf()); // A másik hasonlóan. Mekkora legyen?

SRV létrehozása CD3D11_SHADER_RESOURCE_VIEW_DESC reduceSrv2Desc( D3D11_SRV_DIMENSION_BUFFER, DXGI_FORMAT_R32_FLOAT, 0, 1); device->CreateShaderResourceView( reduceBuffer2.Get(), &reduceSrv2Desc, reduceSrv2.GetAddressOf());

Shaderek betöltése mint korábban

Felszabadítás ne feledkezzünk meg róla

be- és kimenetek, shared memória tömb (csReduceHorizontal.hlsl) Texture2D inputTexture; RWBuffer<float> inputData; RWBuffer<float> outputData; #define groupSize 64 groupshared float sdata[groupSize];

csReduceHorizontal eleje, adatbeolvasás [numthreads( groupSize, 1, 1)] void csReduceHorizontal(uint tid : SV_GroupIndex, uint3 groupIdx : SV_GroupID ) { sdata[tid] = inputTexture.Load(uint3(tid*2 , groupIdx.x, 0)) + inputTexture.Load(uint3(tid*2+1, groupIdx.x, 0)); GroupMemoryBarrierWithGroupSync();

csReduceHorizontal vége, összeadás if (tid < 32) sdata[tid] += sdata[tid + 32]; if (tid < 16) sdata[tid] += sdata[tid + 16]; if (tid < 8) sdata[tid] += sdata[tid + 8]; if (tid < 4) sdata[tid] += sdata[tid + 4]; if (tid < 2) sdata[tid] += sdata[tid + 2]; if (tid < 1) sdata[tid] += sdata[tid + 1]; if (tid == 0) outputData[groupIdx.x] = sdata[0] / 128.0; }

csReduceVertical megírása 128 sorösszeg összegzése csak egy szálcsoportot fogunk indítani beolvasás nem textúrából, hanem adatbufferből sima tömbindexeléssel olvasható különben ugyanaz

Compute shaderek futtatása uint zeros[2] = { 0, 0 }; ID3D11UnorderedAccessView* nulls[2] = { nullptr, nullptr }; context->CSSetShader( csReduceHorizontal->as<ID3D11ComputeShader>().Get(), nullptr, 0); context->CSSetUnorderedAccessViews(0, 1, reduceUav1.GetAddressOf(), zeros); context->CSSetShaderResources(0, 1, sampleSrv.GetAddressOf()); context->Dispatch(128, 1, 1); // másik ugyanígy, csak két buffer van, és 1 csoport

Tone mapping a számolt összeg alapján show PS-ben osszunk az eredményt tartalmazó adatbufferből kiolvasott eredménnyel kell a shaderbe egy Buffer<float> nem RWBuffer mezei shader resource, a végeredmény-buffer SRV-jét kell rákötni, simán materialon keresztül mehet, pl: showMaterial->setShaderResource("toneData", reduceSrv2);

5. házi feladat sok áttetsző plakát megjelenítése geometry shaderrel alpha blending, rajzolás hátulról előre mozogniuk nem feltétlenül kell, de legalább a kamerát lehessen mozgatni szorgalmi: rendezés a GPU-n compute shaderrel brick sort (a.k.a. even-odd transposition sort) egy frameben elég 1-2 rendezési lépést megtenni majdnem rendezett a tömb úgyis ha mozgatjuk a részecskéket, azt is a compute shader csinálja sohasem olvassuk vagy írjuk a buffert a CPU-ról