Render to texture Deferred shading Post-processing blur Szécsi László.
-
Upload
jesus-longyear -
Category
Documents
-
view
219 -
download
0
Transcript of Render to texture Deferred shading Post-processing blur Szécsi László.
Render to textureDeferred shading
Post-processing blur
Szécsi László
Új classEngineDeferred
base: EngineCore
// .h
EngineDeferred(
LPDIRECT3DDEVICE9 device);
// .cpp
EngineDeferred::EngineDeferred(
LPDIRECT3DDEVICE9 device)
:EngineCore(device){}
EngineDeferred.cpp
#include "DXUT.h"
#include "EngineDeferred.h"
#include "Camera.h"
#include "NodeGroup.h"
#include "ShadedMesh.h"
GraphGame.cpp
#include "EngineDeferred.h"
EngineInterface* EngineInterface::
createEngineInstance(
LPDIRECT3DDEVICE9 device)
{
return new EngineDeferred(device);
}
Próba
minden a régi
XML
karaktert, vizet dobjuk ki
autók, terep maradhat
EngineDeferred
virtual HRESULT createDefaultResources();
virtual HRESULT releaseDefaultResources();
virtual void render();
Deferred bufferek
class EngineDeferred{
…
LPDIRECT3DSURFACE9 displayColorBuffer;
LPDIRECT3DSURFACE9 displayDepthStencilBuffer;
LPDIRECT3DTEXTURE9 deferredGeometryTexture;
LPDIRECT3DSURFACE9 deferredGeometrySurface;
LPDIRECT3DTEXTURE9 deferredBrdfTexture;
LPDIRECT3DSURFACE9 deferredBrdfSurface;
EngineDeferred::createDefaultResources
HRESULT EngineDeferred::
createDefaultResources()
{
__super::createDefaultResources();
…
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
EngineDeferred::createDefaultResources végereturn S_OK;
}
Felszabadítás:ReleaseDefaultResources
__super::releaseDefaultResources();
displayColorBuffer->Release();
displayDepthStencilBuffer->Release();
deferredGeometryTexture->Release();
deferredGeometrySurface->Release();
deferredBrdfTexture->Release();
deferredBrdfSurface->Release();
return S_OK;
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
EngineDeferred::render
void EngineDeferred::render()
{
if(sceneRoot == NULL)
return;
effect->SetMatrix("rotProjMatrixInverse", ¤tCamera->second->getOrientProjMatrixInverse());
effect->SetFloatArray("eyePosition", (float*)¤tCamera->second->getEyePosition(), 3);
device->BeginScene();
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);
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();
render vége
device->EndScene();
}
Új szerep: deferEngineDefer::createAutoShad
edMeshvirtual ShadedMesh* createAutoShadedMesh(const std::wstring& meshName, LPD3DXMESH mesh, LPD3DXBUFFER materialBuffer, unsigned int nSubmeshes);
Ú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;
}
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();
}}
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;
};
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;
};
Technique
technique deferred {
pass ExamplePass {
VertexShader = compile vs_2_0 vsQuad();
PixelShader = compile ps_3_0 psDeferred();
}}
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)
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();
}
}
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>
Blur
BlurEngineDeferred.h
LPDIRECT3DTEXTURE9 postProcTexture;
LPDIRECT3DSURFACE9 postProcSurface;
EngineDeferred::createDefaultResources
device->
CreateTexture(
viewportDesc.Width, viewportDesc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT,
&postProcTexture, NULL);
postProcTexture->GetSurfaceLevel(0, &postProcSurface);
World::releaseDefaultResources
postProcTexture->Release();
postProcSurface->Release();
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");…
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();
.fx-be
sampler2D postProcSampler = sampler_state{
texture = < deferredGeometryMap >;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
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;
};
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;
};
technique
technique blurHorizontal
{
pass P0
{
ZENABLE = FALSE;
ZWRITEENABLE = FALSE;
CULLMODE = NONE;
VertexShader = compile vs_3_0 vsBlur();
PixelShader = compile ps_3_0 psBlurHorizontal();
}
};
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();
}
};