37
Render to texture Deferred shading Post-processing blur Szécsi László

Render to texture Deferred shading Post-processing blur Szécsi László

Embed Size (px)

Citation preview

Page 1: Render to texture Deferred shading Post-processing blur Szécsi László

Render to textureDeferred shading

Post-processing blur

Szécsi László

Page 2: Render to texture Deferred shading Post-processing blur Szécsi László

Új classEngineDeferred

base: EngineCore

// .h

EngineDeferred(

LPDIRECT3DDEVICE9 device);

// .cpp

EngineDeferred::EngineDeferred(

LPDIRECT3DDEVICE9 device)

:EngineCore(device){}

Page 3: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred.cpp

#include "DXUT.h"

#include "EngineDeferred.h"

#include "Camera.h"

#include "NodeGroup.h"

#include "ShadedMesh.h"

Page 4: Render to texture Deferred shading Post-processing blur Szécsi László

GraphGame.cpp

#include "EngineDeferred.h"

EngineInterface* EngineInterface::

createEngineInstance(

LPDIRECT3DDEVICE9 device)

{

return new EngineDeferred(device);

}

Page 5: Render to texture Deferred shading Post-processing blur Szécsi László

Próba

minden a régi

Page 6: Render to texture Deferred shading Post-processing blur Szécsi László

XML

karaktert, vizet dobjuk ki

autók, terep maradhat

Page 7: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred

virtual HRESULT createDefaultResources();

virtual HRESULT releaseDefaultResources();

virtual void render();

Page 8: Render to texture Deferred shading Post-processing blur Szécsi László

Deferred bufferek

class EngineDeferred{

LPDIRECT3DSURFACE9 displayColorBuffer;

LPDIRECT3DSURFACE9 displayDepthStencilBuffer;

LPDIRECT3DTEXTURE9 deferredGeometryTexture;

LPDIRECT3DSURFACE9 deferredGeometrySurface;

LPDIRECT3DTEXTURE9 deferredBrdfTexture;

LPDIRECT3DSURFACE9 deferredBrdfSurface;

Page 9: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred::createDefaultResources

HRESULT EngineDeferred::

createDefaultResources()

{

__super::createDefaultResources();

Page 10: Render to texture Deferred shading Post-processing blur Szécsi László

Létrehozás: createDefaultResources

device->GetRenderTarget(0, &displayColorBuffer);

device->GetDepthStencilSurface(&displayDepthStencilBuffer);

D3DSURFACE_DESC viewportDesc;

displayColorBuffer->GetDesc(&viewportDesc);

device->CreateTexture(

viewportDesc.Width, viewportDesc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &deferredGeometryTexture, NULL);

deferredGeometryTexture->GetSurfaceLevel(

0, &deferredGeometrySurface);

// deferredBrdfTexture, surface ugyanígy

Page 11: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred::createDefaultResources végereturn S_OK;

}

Page 12: Render to texture Deferred shading Post-processing blur Szécsi László

Felszabadítás:ReleaseDefaultResources

__super::releaseDefaultResources();

displayColorBuffer->Release();

displayDepthStencilBuffer->Release();

deferredGeometryTexture->Release();

deferredGeometrySurface->Release();

deferredBrdfTexture->Release();

deferredBrdfSurface->Release();

return S_OK;

Page 13: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred::render

ezzel felülírjuk az EngineCore::rendert

- deferring bufferek kitöltése- új role

- quadok rajzolása

- ami kék, azt egyelőre kommentezzük ki

Page 14: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred::render

void EngineDeferred::render()

{

if(sceneRoot == NULL)

return;

effect->SetMatrix("rotProjMatrixInverse", &currentCamera->second->getOrientProjMatrixInverse());

effect->SetFloatArray("eyePosition", (float*)&currentCamera->second->getEyePosition(), 3);

device->BeginScene();

Page 15: Render to texture Deferred shading Post-processing blur Szécsi László

render folyt: buffer kitöltésdevice->SetRenderTarget(0, deferredGeometrySurface);

device->SetRenderTarget(1, deferredBrdfSurface);

device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 200, 0), 1.0f, 0);

sceneRoot->render(RenderContext(device, effect, currentCamera->second, L"defer"));

device->SetRenderTarget(0, displayColorBuffer);

device->SetRenderTarget(1, NULL);

Page 16: Render to texture Deferred shading Post-processing blur Szécsi László

render folyt.

effect->SetTexture("deferredGeometryMap", deferredGeometryTexture);

effect->SetTexture("deferredBrdfMap", deferredBrdfTexture);

effect->SetTechnique("deferred");

UINT np;

effect->Begin(&np, 0);

effect->BeginPass(0);

renderFullViewportQuad();

effect->EndPass();

effect->End();

Page 17: Render to texture Deferred shading Post-processing blur Szécsi László

render vége

device->EndScene();

}

Page 18: Render to texture Deferred shading Post-processing blur Szécsi László

Új szerep: deferEngineDefer::createAutoShad

edMeshvirtual ShadedMesh* createAutoShadedMesh(const std::wstring& meshName, LPD3DXMESH mesh, LPD3DXBUFFER materialBuffer, unsigned int nSubmeshes);

Page 19: Render to texture Deferred shading Post-processing blur Szécsi László

Új szerep: deferEngineDefer::createAutoShad

edMeshShadedMesh* EngineDeferred::createAutoShadedMesh(const std::wstring& meshName, LPD3DXMESH mesh, LPD3DXBUFFER materialBuffer, unsigned int nSubmeshes)

{

ShadedMesh* shadedMesh = newShadedMesh(mesh);

shadedMeshDirectory[meshName] =shadedMesh;

shadedMesh->addRole( L"basic", new Role(materialBuffer, nSubmeshes, textureDirectory, device, "basic"));

shadedMesh->addRole( L"defer", new Role(materialBuffer, nSubmeshes, textureDirectory, device, "defer"));return shadedMesh;

}

Page 20: Render to texture Deferred shading Post-processing blur Szécsi László

defer.fx: Új techniquevoid psDefer(TrafoOutput input,

out float4 geometry :COLOR0, out float4 brdf :COLOR1){

float3 normal = normalize(input.normal);

geometry.xyz = normal;

geometry.w = length(input.worldPos - eyePosition);

brdf = kdColor * tex2D(kdMapSampler, input.tex);

brdf.w = 1;

}

technique defer {

pass ExamplePass {

VertexShader = compile vs_2_0 vsTrafo();

PixelShader = compile ps_3_0 psDefer();

}}

Page 21: Render to texture Deferred shading Post-processing blur Szécsi László

defer.fx: deferred techniquesamplerek

texture deferredGeometryMap;

sampler2D deferredGeometrySampler = sampler_state{

texture = < deferredGeometryMap >;

MinFilter = POINT;

MagFilter = POINT;

MipFilter = POINT;

};

texture deferredBrdfMap;

sampler2D deferredBrdfSampler = sampler_state{

texture = < deferredBrdfMap >;

MinFilter = POINT;

MagFilter = POINT;

MipFilter = POINT;

};

Page 22: Render to texture Deferred shading Post-processing blur Szécsi László

deferredpixel shader

float4 psDeferred(QuadOutput input) : COLOR0 {

float4 geometry =

tex2D( deferredGeometrySampler, input.tex);

float4 brdf =

tex2D( deferredBrdfSampler, input.tex);

float3 viewDir = normalize(input.worldPosMinusEye);

float3 worldPos = eyePosition + viewDir * geometry.w;

//. . .

return brdf * geometry.y;

};

Page 23: Render to texture Deferred shading Post-processing blur Szécsi László

Technique

technique deferred {

pass ExamplePass {

VertexShader = compile vs_2_0 vsQuad();

PixelShader = compile ps_3_0 psDeferred();

}}

Page 24: Render to texture Deferred shading Post-processing blur Szécsi László

Próba

látjuk a normálvektorokat

renderben kék kód visszakommentezése

hiba: nem töröltük a képet

kell egy clear a rendertarget visszaállítás után

hiba: quad textúra koordináták

psDeferred:

input.tex.yx * float2(-1,1)

normál rajzolás (psDeferred)

Page 25: Render to texture Deferred shading Post-processing blur Szécsi László

mindenkinek kell defer rolepl. terrain

void psTerrainDefer(vsTerrainOutput input, out float4 geometry : COLOR0, out float4 brdf : COLOR1)

{

brdf = lerp(c1, c2, input.tileOffset / tileRatio.y - p1);

geometry = 0;

}

technique terrainDefer

{

pass ExamplePass

{

CullMode = CW;

VertexShader = compile vs_3_0 vsTerrain();

PixelShader = compile ps_3_0 psTerrainDefer();

}

}

Page 26: Render to texture Deferred shading Post-processing blur Szécsi László

XML<ShadedMesh name="terrain" mesh="terrain"> <Role name="basic"> <Material technique="terrain"> <Material technique="terrain"> <Texture name="typeMap" file="terrain_type.png" /> <Texture name="tileMap" file="terrain_tiles.png" mips="4" /> <Vector name="textureScale" value.x="32" /> </Material> </Material> </Role> <Role name="defer"> <Material technique="terrainDefer"> <Material technique="terrain"> <Texture name="typeMap" file="terrain_type.png" /> <Texture name="tileMap" file="terrain_tiles.png" mips="4" /> <Vector name="textureScale" value.x="32" /> </Material> </Material> </Role> </ShadedMesh>

Page 27: Render to texture Deferred shading Post-processing blur Szécsi László

Blur

Page 28: Render to texture Deferred shading Post-processing blur Szécsi László

BlurEngineDeferred.h

LPDIRECT3DTEXTURE9 postProcTexture;

LPDIRECT3DSURFACE9 postProcSurface;

Page 29: Render to texture Deferred shading Post-processing blur Szécsi László

EngineDeferred::createDefaultResources

device->

CreateTexture(

viewportDesc.Width, viewportDesc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT,

&postProcTexture, NULL);

postProcTexture->GetSurfaceLevel(0, &postProcSurface);

Page 30: Render to texture Deferred shading Post-processing blur Szécsi László

World::releaseDefaultResources

postProcTexture->Release();

postProcSurface->Release();

Page 31: Render to texture Deferred shading Post-processing blur Szécsi László

deferres menjen a PostProc bufferbe

EngineDeferred::renderdevice->SetRenderTarget(0, postProcSurface);

device->SetRenderTarget(1, NULL);

effect->SetTexture("deferredGeometryMap", deferredGeometryTexture);

effect->SetTexture("deferredBrdfMap", deferredBrdfTexture);

effect->SetTechnique("deferred");…

Page 32: Render to texture Deferred shading Post-processing blur Szécsi László

H és V blur lépések

device->SetRenderTarget(0, deferredGeometrySurface);

effect->SetTexture("deferredGeometryMap", postProcTexture);

effect->SetTechnique("blurHorizontal");effect->Begin(&np, 0);

effect->BeginPass(0);

renderFullViewportQuad();effect->EndPass();

effect->End();

device->SetRenderTarget(0, displayColorBuffer);

effect->SetTexture("deferredGeometryMap", deferredGeometryTexture);

effect->SetTechnique("blurVertical");effect->Begin(&np, 0);

effect->BeginPass(0);

renderFullViewportQuad();effect->EndPass();

effect->End();

Page 33: Render to texture Deferred shading Post-processing blur Szécsi László

.fx-be

sampler2D postProcSampler = sampler_state{

texture = < deferredGeometryMap >;

MinFilter = Linear;

MagFilter = Linear;

MipFilter = Linear;

};

Page 34: Render to texture Deferred shading Post-processing blur Szécsi László

blur vertex shader

struct BlurInput {

float4 pos : POSITION;

float2 tex : TEXCOORD0;

};

struct BlurOutput {

float4 pos : POSITION;

float2 tex : TEXCOORD0;

};

BlurOutput vsBlur(BlurInput input) {

BlurOutput output = (BlurOutput)0;

output.pos = input.pos;

output.tex = input.tex.yx * float(-1, 1);

return output;

};

Page 35: Render to texture Deferred shading Post-processing blur Szécsi László

horiz pixel shaderfloat4 psBlurHorizontal(BlurOutput input) : COLOR0 {

float4 filtered =

tex2D( postProcSampler, input.tex + float2(8.5/640.0, 0.5/480.0))

+ tex2D( postProcSampler, input.tex + float2(4.5/640.0, -0.5/480.0)) * 2

+ tex2D( postProcSampler, input.tex + float2(0.5/640.0, 0.5/480.0)) * 3

+ tex2D( postProcSampler, input.tex + float2(-3.5/640.0, -0.5/480.0)) * 3

+ tex2D( postProcSampler, input.tex + float2(-7.5/640.0, 0.5/480.0)) * 2

+ tex2D( postProcSampler, input.tex + float2(-11.5/640.0, -0.5/480.0));

return filtered / 12;

};

Page 36: Render to texture Deferred shading Post-processing blur Szécsi László

technique

technique blurHorizontal

{

pass P0

{

ZENABLE = FALSE;

ZWRITEENABLE = FALSE;

CULLMODE = NONE;

VertexShader = compile vs_3_0 vsBlur();

PixelShader = compile ps_3_0 psBlurHorizontal();

}

};

Page 37: Render to texture Deferred shading Post-processing blur Szécsi László

Verticalfloat4 psBlurVertical(BlurOutput input) : COLOR0

{

float4 filtered =

tex2D( postProcSampler, input.tex + float2(8.5/640.0, 0.5/480.0).yx)

+ tex2D( postProcSampler, input.tex + float2(4.5/640.0, -0.5/480.0).yx) * 2

+ tex2D( postProcSampler, input.tex + float2(0.5/640.0, 0.5/480.0).yx) * 3

+ tex2D( postProcSampler, input.tex + float2(-3.5/640.0, -0.5/480.0).yx) * 3

+ tex2D( postProcSampler, input.tex + float2(-7.5/640.0, 0.5/480.0).yx) * 2

+ tex2D( postProcSampler, input.tex + float2(-11.5/640.0, -0.5/480.0).yx)

;

return filtered / 12;

};

technique blurVertical

{

pass P0

{

ZENABLE = FALSE;

ZWRITEENABLE = FALSE;

CULLMODE = NONE;

VertexShader = compile vs_3_0 vsBlur();

PixelShader = compile ps_3_0 psBlurVertical();

}

};