Többmenetes renderelés Grafikus játékok fejlesztése Szécsi László 2013.03.27. g11-multipass.

Slides:



Advertisements
Hasonló előadás
OpenGL 2. gyakorlat Hapák József
Advertisements

GraphGame gg001-Triangle
Árnyalás – a felületi pontok színe A tárgyak felületi pontjainak színezése A fényviszonyok szerint.
 Árnyalási egyenlet  Saját emisszió  Adott irányú visszaverődés.
Globális illumináció (GI)
GPU Szirmay-Kalos László.
Sugárkövetés: ray-casting, ray-tracing
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Sugárkövetés: ray-casting, ray-tracing Szirmay-Kalos László.
3D képszintézis fizikai alapmodellje
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.
Grafikus játékok fejlesztése Szécsi László g11-physics
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.
A virtuális technológia alapjai Dr. Horváth László Budapesti Műszaki Főiskola Neumann János Informatikai Kar, Intelligens Mérnöki Rendszerek.
Számítógépes grafika 3. gyakorlat.
Számítógépes grafika 5. gyakorlat. Előző órán Textúrázási módok Pixel shader használata.
Számítógépes Grafika Programtervező informatikus (esti)‏ Textúrázás.
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 ◦
Sugárkövetés: ray-casting, ray-tracing
Térfogatvizualizáció
Vektorok különbsége e-x = [ex-xx ey-xy ez-xz] e e-x x szempozíció
Fraktálok és csempézések
Environment mapping Szécsi László. Új osztály: Lab3EnvMap copy&paste: Lab2Trafo.h -> Lab3EnvMap.h copy&paste: Lab2Trafo.cpp -> Lab3EnvMap.cpp copy&paste:
Sugárkövetés: ray-casting, ray-tracing
Térfogatvizualizáció
3D képszintézis fizikai alapmodellje Szirmay-Kalos László Science is either physics or stamp collecting. Rutherford.
Rendering pipeline Ogre3D
Textúrák Grafikus játékok fejlesztése Szécsi László g07-texture.
Kamera, 3D, transzformációk Szécsi László. Math.zip kibontása az Egg projectkönyvtárba – float2, foat3, float4 típusok, HLSL-ben megszokott műveletekkel.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
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.
Grafikus játékok fejlesztése Szécsi László t09-texture
Textúrázás Szécsi László. giraffe.jpg letöltése SolutionDir/Media folderbe.
Számítógépes grafika DirectX 5. gyakorlat. Emlékeztető Háromdimenziós alapok befejezése Textúrázás.
Számítógépes Grafika 7. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
GPU ELTE IK Számítógépes Grafika II. Jeni László Attila
OpenGL 4 shaderek, GLSL Valasek Gábor
GPGPU A grafikus hardver általános célú felhasználása
Jeni László Attila Klár Gergely
Árnyalás – a felületi pontok színe A tárgyak felületi pontjainak színezése A fényviszonyok szerint.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
Informatikai eszközök a virtuális valóság szolgálatában Hapák József ELTE-IK X. Eötvös Konferencia.
Máté: Orvosi képfeldolgozás12. előadás1 Három dimenziós adatok megjelenítése Metszeti képek transzverzális, frontális, szagittális, ferde. Felület síkba.
4.6. A Fénysugár-követés módszere (ray-tracing) Mi látható a képernyőn, egy-egy képpontjában ? És az ott milyen színű ? (4.7. Árnyalás)
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
6. A 3D grafika alapjai 6.1. A 3D szerelőszalag fölépítése 6.2. Térbeli alakzatok képe 6.3. Térbeli képelemek és modell-adatszerkezetek 6.4. Képelemek.
Anyagok, megvilágítás. Rendering egyenlet I(x,  )=I e (x,  )+   I(h(x,-  ’ ,  ’) f r (  ’,x,  ) cos  ’d  ’
Bevezetés.  Miért …  … egyszálúan programozunk?  … probléma ez?  Hogyan …  … változik ez?  … tudjuk kihasználni?  Megéri-e párhuzamosítani?
3D grafika összefoglalás
Szécsi László 3D Grafikus Rendszerek 17. előadás
Global Illumination.
Lighting III.
Vizualizáció és képszintézis
A grafikus hardware programozása
6. A 3D grafika alapjai 6.1. A 3D szerelőszalag fölépítése
Vizualizáció és képszintézis
Vizualizáció és képszintézis
Szécsi László 3D Grafikus Rendszerek 14. előadás
OpenGL IV.
6. A 3D grafika alapjai 6.1. A 3D szerelőszalag fölépítése
Vizualizáció és képszintézis
GPGPU – CUDA 2..
Direct3D DirectCompute
Bevezetés GPGPU Alkalmazások.
Environment mapping Szécsi László
CUDA – OpenGL.
Előadás másolata:

Többmenetes renderelés Grafikus játékok fejlesztése Szécsi László g11-multipass

Globális illumináció vs. hardware Cél a rendering egyenlet megoldása az inkrementális képszintézis gyors, mert – a felületi pontok (pixelek) színét függetlenül számolja – csak lokális jellemzőket vesz figyelembe BRDF, normálvektor absztrakt fényforrások I(x,  )=I e (x,  )+   I(h(x,-  ’ ,  ’) f r (  ’,x,  ) cos  ’d  ’

Lokalitási probléma Mi van ha nem-lokális fényjelenségeket is meg akarunk jeleníteni? – árnyékok – visszavert környezeti fény tökéletes visszaverődés diffúz vagy fényes visszaverődés – közvetett megvilágítás color bleeding – kausztikus fényjelenségek

Megoldás több menetes számolás – előző menetek eredményeinek tárolása textúrában – a végső kép kialakításánál ennek figyelembe vétele függést tudunk létrehozni egyedi lokális számítások között

Eszköz: Render target frame buffer helyett textúra z-buffer, stencil buffer helyett textúra Direct3D – textúra erőforrás létrehozása [D3D11_BIND_RENDER_TARGET] – célnézet létrehozása [ID3D11RenderTargetView] textúra valamelyik mipmap szintje kocka textúra valamelyik lapjának valamelyik mipmap szintje – RTV beállítása mint render target/depth buffer

Render target textures Input Assembler I. input streaming Vertex Shader Geometry Shader Vertex buffer Instance buffer Index buffer RESOURCESPIPELINE STAGESRENDER STATES Input layout Input Assembler II. primitive setup Primitive type Rasterizer face culling depth bias adjustment clipping homogenous division viewport transformation output filtering Fragment Shader Output merger stencil test depth test blending vertex data, instance data processed vertex data primitive data primitive strip data fragments with interpolated data fragment color and depth Output buffer Render target textures Depth-stencil texture Depth-stencil state Constant buffers and textures Constant buffers and textures Constant buffers and textures Shader program Blending state Viewport Filtering Cull mode Depth bias Uniform parameters Shader program Uniform parameters Shader program Uniform parameters Fill mode

Direct3D ID3D11Texture2D* texture; ID3D11RenderTargetView* rtv; ID3D11ShaderResourceView * srv;

Direct3D – RTT textúra létrehozása D3D11_TEXTURE2D_DESC textureDesc; ZeroMemory( &textureDesc, sizeof(textureDesc) ); textureDesc.Width = 512; textureDesc.Height = 512; textureDesc.MipLevels = 1; textureDesc.ArraySize = 1; textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; textureDesc.SampleDesc.Count = 1; textureDesc.Usage = D3D11_USAGE_DEFAULT; textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; device->CreateTexture2D( &textureDesc, NULL, &texture );

Direct3D - RTV D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; rtvDesc.Format = textureDesc.Format; rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; rtvDesc.Texture2D.MipSlice = 0; device->CreateRenderTargetView( texture, &rtvDesc, &rtv );

Direct3D - SRV D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; srvDesc.Format = textureDesc.Format; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MostDetailedMip = 0; srvDesc.Texture2D.MipLevels = 1; device->CreateShaderResourceView( texture, &srvDesc, &srv );

Default RTV és DSV ID3D11RenderTargetView* defaultRtv = DXUTGetD3D11RenderTargetView(); ID3D11DepthStencilView* defaultDsv = DXUTGetD3D11DepthStencilView();

Direct3D - render context->OMSetRenderTargets( 1, &rtv, NULL ); // rajzolás textúrába, draw hívások context->OMSetRenderTargets( 1, &defaultRtv, defaultDsv); effect->getVariableByName("texture")- >AsShaderResource()->SetResource(srv); // rajzolás frame bufferbe, draw hívások

Multiple render target egy nézetre és geometriára több mindent szeretnénk kiszámolni – nem fér bele egy pixel ARGB csatornáiba legyen több (max. 4) render target – pixel shader 4 kimenő float4 értéket írhat [SV_Target0..3]

Késleltetett árnyalás [deferred shading] 1.menet – piszok bonyolult geometria kirajzolása – render targetekbe a felületi pont pozíciója, normálja, BRDF paraméterei többi menet (geometria rajzolása nélkül) – full screen quad rajzolása a képernyőre – pixel shader a textúrákból olvassa be az árnyaláshoz szükséges adatokat menetek eredménye összeadódik pl. blendinggel

deferred shading full screen quad Deferred shading FAT buffer fat építés színtér geometria shaderrender target pos, normal, color frame buffer deferred shading full screen quad render target textúra olvasás 1. fény adatai 2. fény adatai 

FAT író shader vertex shader marad a klasszikus trafó pixel shader [MRT] struct PsosDefer { float4 geometry : SV_Target0; float4 brdf : SV_Target1; }; PsosDefer psDefer(VsosTrafo input){ PsosDefer output; output.geometry = float4( normalize(input.normal), length(input.worldPos.xyz - eyePos) ); output.brdf = kdTexture.Sample(linearSampler, input.tex); return output; }

Deferred shader [VS] float4x4 viewDirMatrix; VsosQuad vsQuad(IaosQuad input) { VsosQuad output = (VsosQuad)0; output.pos = input.pos; float4 hViewDir = mul(input.pos, viewDirMatrix); hViewDir /= hViewDir.w; output.viewDir = hViewDir.xyz; output.tex = input.tex; return output; };

Deferred shader [PS] float4 psDeferred(VsosQuad input) : SV_Target { float4 geometry = geometryTexture.SampleLevel( pointSampler, input.tex, 0); float4 brdf = brdfTexture.SampleLevel( pointSampler, input.tex, 0); float3 viewDir = normalize(input.viewDir); float3 worldPos = eyePosition + viewDir * geometry.w; float3 lightDiff = spotLight.position - worldPos; float3 lightDir = normalize(lightDiff); float3 lighting = spotLight.peakRadiance * max(0, dot(geometry.xyz, lightDir)) * pow(max(0,dot(-lightDir, spotLight.direction)), spotLight.focus) / dot(lightDiff, lightDiff); return float4(lighting, 1) * brdf; };

3D helyett nem csak a klasszikus 3D perspektív pipelinet használhatjuk egy menetben – full screen quad: minden pixelre futtatunk egy pixel shadert – render-to-UV-atlas a geometriát rajzoljuk a vertex bufferben output.pos = (input.tex * 2) - 1; a kész textúra sima textúrázással felrakható

Árnyékok pixel árnyékvető árnyékfogadó nem lokális döntés – a színtér geometriájától függ objektumtér – shadow volumes képtér – depth shadow maps

Shadow map 1. menet – a fényforrásból lefényképezzük a színteret – a pixel shader az árnyalt pont távolságát írja ki a fényforrástól – textúrában tároljuk az eredményt 2. menet – képernyőre rajzolunk – a pixel shader kiszámolja az árnyalt pont távolságát és összeveti a textúrában tárolttal – ennek függvényében veszi figyelembe a fényt

Árnyék leképezés [depth shadow map] a színtér-geometria mintavételezett reprezentációja térkép távolság a lexelekben pixel

1. menet Depth map előállítás kamera a fényforrásnál textúrába rendereljük a színteret render target pixel shader a távolságot írja ki

Depth shadow map result

Hardware shadow map a mélység buffer legyen az árnyéktérkép nem kell külön shadert írni a generáláshoz HW percentage closer filtering z-buffer lexelekben a mélység 0 1 interpoláció

Shadow maphez a végső megjelenítés A shaderben kiszámítjuk a pont pozícióját a depth map textúra terében a fény- kamera transzformációjával – depthTexPos = (u, v, depth, 1.0) a pixel shaderben: float visibility = tex2Dproj(depthMapSampler, depthTexPos); – összehasonlít, 0 vagy 1 értékű – szűrt: percentage closer filtering

HW percentage closer filtering result

Shadow map + deferred Egyszerre csak véges számú depth map textúrát olvashat a pixel shader és azokra sem lehet ciklust írni – nincs textúra-tömb deferred – minden fényre egy full screen quad – deferred pass előtt depth map kiszámítása – aktuális fényforrás adatainak átadása

Geometry maps rendereljünk plusz információt, ne csak a mélységet tároljuk a sziluett-éleket – az él egyenletének együtthatóit az élre tesztelhetünk ha a sziluetten vagyunk – pontokat a sziluett mentén Silhouette map [Sen, Cammarano and Hanrahan ] torzított, sziluettre illeszkedő mélység-térkép

A silhouette map torzított mélység térkép rácsa egy mélység-minta minden cellában siluett pontok rácsa alapján keressük meg hogy az árnyalt pont melyik cellába esik

Geometry map eredmények

Post processing ‘Végső’ renderelés frame buffer helyett textúrába ezen képfeldolgozási műveletek full screen quad a képernyőre, ráfeszítve a kép

Blur eredeti képtemp vízszintes szűrés függőleges szűrés frame buffer

Image based lighting 1. menet – készítünk 6 képet a színtérről a tükröző felületű objektum pozíciójából – az ereményt egy kocka textúra lapjain tároljuk 2. menet – képernyőre – tükröző geometria rajzolása – pixel shader tükörirányt számol és a kocka térképből olvas

Image based lighting

Diffuse/Glossy visszaverődés cos  ’

Environment mapping

Az environment map hibája Environment mapValódi visszaverődés

távolság radiancia Environment map + távolságok Distance Impostors

Sugárkövetés kereséssel

Csak közelítés

A közelítés hibája 1 iteration 4 iterations8 iterations

Lokalizált visszaverődések distance radiance

Többszörös törés távolság normálok környezet

Caustics távolság textúra u, v textúra uv, teljesítmény

32 x 32 Textúra moduláció Textúra a fotonok uv koordinátáival Vertex shader Billboard pozíciók filter Pixel shader light map textúra 256 x 256

Light map virtuális fényforrásokkal photon tracing sugárkövetéssel – fotontalálatok mint pontszerű fényforrások előkészítő menetek [minden fényforrásra] – render-to-UV-atlas + blending [add] – a texelhez tartozó pontot árnyaljuk a fényforrásra végső menet – a kész előre számított indirekt megvilágítást is tartalmazó textúrát ráfeszítjük a színtérre