depth of field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008....

12
2005. 12. 05 게임프로그래밍 Depth Of Field : 손 효영 2005. 12. 05 게임프로그래밍 실행 화면

Upload: others

Post on 29-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

Depth Of Field

발 표 자 : 손 효 영

2005. 12. 05 게임프로그래밍

실행 화면

Page 2: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DirectX Framwork

• D3dApp.cpp- Framwork의 중심이 되는 핵심 클래스 (CD3DApplication)

• D3dFile.cpp- .X 모델 파일을 지원하는 모델 클래스 (CD3DFile)

• D3dFont.cpp- 화면상에 문자를 출력 가능하게 하는 클래스 (CD3DFont)

• D3dUtil.cpp- Material, Light, Texture 등을 지원하는 3D 함수들의 모음

• DxUtil.cpp- Media, Registry, Timer 같은 편의성을 제공하는 함수들의 모음

2005. 12. 05 게임프로그래밍

DirectX Framwork의 주요 함수(1)

• OneTimeSceneInit()• InitDeviceObjects()• RestoreDeviceObjects()• InvalidateDeviceObjects()• DeleteDeviceObjects()• FinalCleanup()• FrameMove()• Render()• MsgProc( HWND hWnd, UINT uMsg, WPARAM

wParam, LPARAM lParam )

Page 3: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DirectX Framwork의 주요 함수(2)

OneTimeSceneInit()• 프로그램이 수행할 때 처음 한번만 수행되는 함수• D3 Device의 Reset과 상관없이 계속 메모리에 존재하는 객체들

의 설정.• Font, 객체 등의 메모리 할당..

InitDeviceObjects()• D3D Device가 초기 설정될 때 객체들을 초기화하는 함수

• D3 Device의 Reset이 되도 다시 설정할 필요가 없는 특성 설정

• Font, 객체들의 로딩 처리

2005. 12. 05 게임프로그래밍

DirectX Framwork의 주요 함수(3)

RestoreDeviceObjects()• 생성된 객체들을 메모리에 올려준다.• InitDeviceObjects()에서 로딩된 모델과 각종 라이트의 설정 및 매

트리얼 설정• D3D Device가 Reset되면 다시 설정되는 값들의 설정

InvalidateDeviceObjects()• D3D Device가 Reset되는 시점에서 메모리에 올려진 객체들을 해

제한다.

Page 4: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DirectX Framwork의 주요 함수(4)

DeleteDeviceObjects ()• D3D Device가 소멸되는 시점에서 메모리에 올려진 객체들을 해

제한다.

FinalCleanup()• 프로그램이 종료되는 시점에서 남은 메모리를 모두 해제하는 함

• OneTimeSceneInit() 함수에서 할당한 메모리의 반납

2005. 12. 05 게임프로그래밍

DirectX Framwork의 주요 함수(5)

FrameMove()• 프로그램에서 업데이트를 수행하는 함수• 게임의 로직 처리 및 에니메이션 업데이트를 수행하는 부분

Render()• 게임을 화면에 나타내는 부분

• 이부분에서 게임 로직을 처리하면 안된다

Page 5: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DirectX Framwork의 주요 함수(6)

MsgProc ()• 윈도우의 메시지를 처리하는 부분• 일반 윈도우 메시지 처리 방식

2005. 12. 05 게임프로그래밍

함수 관계도

Page 6: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

전역변수float3 lightPos;float3 viewPos;float4 mtrlAmbient;float4 mtrlDiffuse;float4 mtrlSpecular;

float focalDist;float focalRange;

matrix matWorldViewProj;

texture tTexture;

Scene.fx 파일 구조(1)

• 텍스쳐를 사용한 쉐이딩과 텍스쳐를 사용하지 않는 쉐이딩.

버텍스 쉐이더 구조체.struct VS_INPUT{

float4 vPosition: POSITION;float3 vNormal: NORMAL;float2 vTexCoord: TEXCOORD0;

};struct VS_OUTPUT_NOTEX{

float4 vPosition: POSITION;float fDepth: TEXCOORD0;float3 vNormal: TEXCOORD1;float3 vL: TEXCOORD2;float3 vH: TEXCOORD3;

};struct VS_OUTPUT_TEX{

float4 vPosition: POSITION;float fDepth: TEXCOORD0;float3 vNormal: TEXCOORD1;float3 vL: TEXCOORD2;float3 vH: TEXCOORD3;float2 vTexCoord: TEXCOORD4;

};

픽셀 쉐이더 구조체.struct PS_INPUT_NOTEX{

float4 vColor: COLOR0;float fDepth: TEXCOORD0;float3 vNormal: TEXCOORD1;float3 vL: TEXCOORD2;float3 vH: TEXCOORD3;

};struct PS_INPUT_TEX{

float4 vColor: COLOR0;float fDepth: TEXCOORD0;float3 vNormal: TEXCOORD1;float3 vL: TEXCOORD2;float3 vH: TEXCOORD3;float2 vTexCoord: TEXCOORD4;

};struct PS_OUTPUT{

float4 vColor: COLOR0;float4 vDoF: COLOR1;

};

2005. 12. 05 게임프로그래밍

Scene.fx 파일 구조(2)

// Simple non-textures object vertex shaderVS_OUTPUT_NOTEX obj_no_tex_vs(VS_INPUT v){

VS_OUTPUT_NOTEX o;float4 vPosWVP;vPosWVP = mul(v.vPosition, matWorldViewProj);o.vPosition = vPosWVP;o.fDepth = vPosWVP.z;

o.vNormal = v.vNormal;o.vL = normalize(lightPos - v.vPosition);// Compute halfway vectoro.vH = normalize(normalize(viewPos -

v.vPosition) + o.vL);return o;

}

NoTexture vertex shader

Page 7: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

Scene.fx 파일 구조(3)

// Non-textured object pixel shaderPS_OUTPUT obj_no_tex_ps(PS_INPUT_NOTEX v){

PS_OUTPUT o;

float specularExp = 70.0f;float4 lightDiffuse = float4(0.5f, 0.5f, 0.5f, 1.0f);

float3 vN = normalize(v.vNormal);float3 vL = normalize(v.vL);float3 vH = normalize(v.vH);

// Compute coloro.vColor = dot(vN, vL) * mtrlDiffuse * lightDiffuse +

pow(dot(vN, vH), specularExp) * mtrlSpecular + mtrlAmbient;

// Blur factor based on the distance from focal planefloat blur = saturate(abs(v.fDepth - focalDist) * focalRange);

// Depth valueo.vDoF = float4(v.fDepth, blur, 0, 0);

return o;}

NoTexture Pixel shader

2005. 12. 05 게임프로그래밍

Scene.fx 파일 구조(4)

technique ObjNoTex{

pass P0{

VertexShader = compile vs_2_0 obj_no_tex_vs();PixelShader = compile ps_2_0 obj_no_tex_ps();

CullMode = NONE;}

}

Technique & Pass

Page 8: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

Scene.fx 파일 구조(5)

// Simple textured object vertex shaderVS_OUTPUT_TEX obj_tex_vs(VS_INPUT v){

VS_OUTPUT_TEX o;float4 vPosWVP;

vPosWVP = mul(v.vPosition, matWorldViewProj);o.vPosition = vPosWVP;o.fDepth = vPosWVP.z;

o.vNormal = v.vNormal;o.vL = normalize(lightPos - v.vPosition);// Compute halfway vectoro.vH = normalize(normalize(viewPos - v.vPosition) + o.vL);o.vTexCoord = v.vTexCoord;

return o;}

Texture vertex shader

2005. 12. 05 게임프로그래밍

Scene.fx 파일 구조(6)

// Use point sampling for sharp tile edges on the wallssampler PointTexSampler = sampler_state{

Texture = (tTexture);

MinFilter = Point;MagFilter = Point;AddressU = Wrap;AddressV = Wrap;

};

// Textured object pixel shaderPS_OUTPUT obj_tex_ps(PS_INPUT_TEX v){

PS_OUTPUT o;

float3 vN = normalize(v.vNormal);float3 vL = normalize(v.vL);float3 vH = normalize(v.vH);

// Compute coloro.vColor = dot(vN, vL) * tex2D(PointTexSampler,

v.vTexCoord) + mtrlAmbient;

// Blur factor based on the distance from focal plane

float blur = saturate(abs(v.fDepth - focalDist) * focalRange);

// Depth valueo.vDoF = float4(v.fDepth, blur, 0, 0);

return o;}

Texture sampler & Pixel shader & Technique

technique ObjTex{

pass P0{VertexShader = compile vs_2_0

obj_tex_vs();PixelShader = compile ps_2_0

obj_tex_ps();CullMode = NONE;}

}

Page 9: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DoF.fx 파일구조 (1)

// Number of outer filter taps#define NUM_DOF_TAPS 12

float4 viewportScale;float4 viewportBias;

float maxCoC;

float2 filterTaps[NUM_DOF_TAPS];

texture tSceneColor;texture tBlurDepth;

struct VS_INPUT{

float4 vPos: POSITION;float2 vTexCoord: TEXCOORD;

};

struct VS_OUTPUT{

float4 vPos: POSITION;float2 vTexCoord: TEXCOORD;

};

struct PS_INPUT{

float2 vTexCoord: TEXCOORD;};

sampler SceneColorSampler = sampler_state{

texture = (tSceneColor);

MinFilter = Point;MagFilter = Point;AddressU = Clamp;AddressV = Clamp;

};

전역변수

sampler DepthBlurSampler = sampler_state{

texture = (tBlurDepth);

MinFilter = Point;MagFilter = Point;AddressU = Clamp;AddressV = Clamp;

};

2005. 12. 05 게임프로그래밍

DoF.fx 파일구조 (2)

// Screen space vertex shaderVS_OUTPUT filter_dof_vs(VS_INPUT v){

VS_OUTPUT o;// Scale and bias viewporto.vPos = v.vPos * viewportScale + viewportBias;// Output tex. coordinateso.vTexCoord = v.vTexCoord;return o;

}

Page 10: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DoF.fx 파일구조 (3)

// DoF filter shaderfloat4 filter_dof_ps(PS_INPUT v) : COLOR{

// Get center samplefloat4 colorSum = tex2D(SceneColorSampler, v.vTexCoord);float2 centerDepthBlur = tex2D(DepthBlurSampler, v.vTexCoord);// Compute CoC size based on blurriness (CoC : Circle Of Confusion)float sizeCoC = centerDepthBlur.y * maxCoC;float totalContribution = 1.0f;// Run through all tapsfor (int i = 0; i < NUM_DOF_TAPS; i++){

// Compute tap coordinatesfloat2 tapCoord = v.vTexCoord + filterTaps[i] * sizeCoC;// Fetch tap samplefloat4 tapColor = tex2D(SceneColorSampler, tapCoord);float2 tapDepthBlur = tex2D(DepthBlurSampler, tapCoord);// Compute tap contributionfloat tapContribution = (tapDepthBlur.x > centerDepthBlur.x) ? 1.0f : tapDepthBlur.y;// Accumulate color and contributioncolorSum += tapColor * tapContribution;totalContribution += tapContribution;

}// Normalize to get proper luminancefloat4 finalColor = colorSum / totalContribution;return finalColor;

}

2005. 12. 05 게임프로그래밍

Page 11: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

DoF.fx 파일구조 (4)

technique FilterDoF{

pass P0{

VertexShader = compile vs_2_0 filter_dof_vs();PixelShader = compile ps_2_0 filter_dof_ps();

CullMode = NONE;}

}

2005. 12. 05 게임프로그래밍

DoF.fx 파일구조 (5)

float depthScale;

// Helper shader for visualizing depth/blurrinessfloat4 depth_blur_overlay_ps(PS_INPUT v) : COLOR{

float4 BlurDepth = tex2D(DepthBlurSampler, v.vTexCoord);

return float4(BlurDepth.x * depthScale, BlurDepth.y, 0, 0);}

technique DepthBlurOverlay{

pass P0{

VertexShader = compile vs_2_0 filter_dof_vs();PixelShader = compile ps_2_0 depth_blur_overlay_ps();

CullMode = NONE;}

}

Page 12: Depth Of Field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008. 9. 10. · 2005. 12. 05 게임프로그래밍 Depth Of Field 발표자: 손효영

2005. 12. 05 게임프로그래밍

Demo