depth of field - hallym.ac.krgraphics.hallym.ac.kr/teach/2005/gp2/src/assign/20005095.pdf · 2008....
TRANSCRIPT
2005. 12. 05 게임프로그래밍
Depth Of Field
발 표 자 : 손 효 영
2005. 12. 05 게임프로그래밍
실행 화면
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 )
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되는 시점에서 메모리에 올려진 객체들을 해
제한다.
2005. 12. 05 게임프로그래밍
DirectX Framwork의 주요 함수(4)
DeleteDeviceObjects ()• D3D Device가 소멸되는 시점에서 메모리에 올려진 객체들을 해
제한다.
FinalCleanup()• 프로그램이 종료되는 시점에서 남은 메모리를 모두 해제하는 함
수
• OneTimeSceneInit() 함수에서 할당한 메모리의 반납
2005. 12. 05 게임프로그래밍
DirectX Framwork의 주요 함수(5)
FrameMove()• 프로그램에서 업데이트를 수행하는 함수• 게임의 로직 처리 및 에니메이션 업데이트를 수행하는 부분
Render()• 게임을 화면에 나타내는 부분
• 이부분에서 게임 로직을 처리하면 안된다
2005. 12. 05 게임프로그래밍
DirectX Framwork의 주요 함수(6)
MsgProc ()• 윈도우의 메시지를 처리하는 부분• 일반 윈도우 메시지 처리 방식
2005. 12. 05 게임프로그래밍
함수 관계도
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
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
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;}
}
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;
}
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 게임프로그래밍
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;}
}
2005. 12. 05 게임프로그래밍
Demo