Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Chapter 28. Practical Post-Process Depth of Field<br />GPU Gems3<br />http://ohyecloudy.com<br />http://cafe.naver.com/sha...
Depth of Field<br />
용어 정리<br />CoC(Circle of confusion, 착란원)<br />
Overview<br />Post-Process Stage에서 DoF를 구현한다.<br />Depth Texture를 사용<br />depth 값을 사용해 CoC를 구한다.<br />Blur 경계를 부드럽게 표현<br ...
공식 유도<br />CoC의 반지름을 구한다.<br />
Imaging<br />Plane<br />lens<br />초점거리 변수focal length<br />
Initial Stochastic Approach<br />The Scatter-as-Gather Approach<br />The Blur Approach<br />Evolution of the Algorithm<br />
original texture<br />Search CoC<br />모든 픽셀의 CoC계산.<br />계산된 CoC를 원본 이미지 샘플링에 사용.<br />원형 푸아송 분포(Poisson distribution)<br ...
sharp silhouettes. <br />Sharp silhouettes<br />Ringing artifacts<br />low-quality 텍스쳐를 사용한 것처럼 나온다.<br />
Initial Stochastic Approach<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정<br />	Sharp shilhouettes, Ring artifact, 텍스쳐 품질 저하.<br />T...
현재 계산중인 픽셀이 CoC범위에 들지 않으므로 제외<br />original texture<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정.<br />각자 자신의 CoC를 가진다.<br />주변 픽셀을...
sharp silhouettes. <br />Sharp silhouettes<br />Ringing artifacts<br />low-quality 텍스쳐를 사용한 것처럼 나온다.<br />블러된텍스쳐 질은 향상<br />
Initial Stochastic Approach<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정<br />	Sharp shilhouettes, Ring artifact, 텍스쳐 품질 저하.<br />T...
CoC<br />focus, background<br />CoC = 1<br />¼ down scaling<br />CoC<br />blurred<br />CoC<br />
focused와 unfocused 경계선이 부드럽지 않다.<br />최대 blur와 focused 오브젝트의 경계선은 약 50% blur<br />gradient가 필요.<br />diameter <br />
Initial Stochastic Approach<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정<br />	Sharp shilhouettes, Ring artifact, 텍스쳐 품질 저하.<br />T...
Initial Stochastic Approach<br />The Scatter-as-Gather Approach<br />The Blur Approach<br />
구현 고려 사항<br />Depth Information<br />	R32F Texture<br />Variable-Width Blur<br />Circle of Confusion Radius<br />First-Per...
piecewise linear curve로 approximate <br />서로 다른 blur radius 3개<br />오리지널 unblurred sample<br />2개의 큰 blur radius<br />다운 샘...
가장 작은 blur radius<br />5번의 texture lookup<br />	5X5에서 평균 17 픽셀<br />가장 작은 blur<br />실제 blur된 컬러의 approximation<br />연속된 bl...
구현 고려 사항<br />Depth Information<br />	R32F Texture<br />Variable-Width Blur<br />	blur radius 3개 + unblurred sample<br />가...
Depth Texture에 기록된 Depth 값으로 구한다.<br />더 자유로운 표현을 위해<br />	world-near-end distance<br />	world-far-start distance<br />
구현 고려 사항<br />Depth Information<br />	R32F Texture<br />Variable-Width Blur<br />	blur radius 3개 + unblurred sample<br />가...
FPS(first-person shooter)게임에서 플레이어 무기 표현은 매우 중요<br />특별 처리<br />view model로 따로 near, far 값을 갖게 한다.<br />world와 view model의...
구현 고려 사항<br />Depth Information<br />	R32F Texture<br />Variable-Width Blur<br />	blur radius 3개 + unblurred sample<br />가...
The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br />soft egde를 표현하기 위한 near CoC생성<br />렌더...
structPixelInput<br />{<br />float4 position : POSITION;<br />float2 tcColor0 : TEXCOORD0;<br />float2 tcColor1 : TEXCOORD...
constfloat2dofRowDelta;// float2( 0, 0.25 / renderTargetHeight )<br />half4DofDownPS( constPixelInput pixel ) : COLOR<br /...
Color Texture<br />Depth Texture<br />DofDownTexture<br />
The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br />	soft egde를 표현하기 위한 near CoC생성<br />렌...
// These are set by the game engine.<br />samplershrunkSampler;  // Output of DofDownsample() <br />samplerblurredSampler;...
The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br />	soft egde를 표현하기 위한 near CoC생성<br />렌...
// This vertex and pixel shader applies a 3 x 3 blur to the image in<br />// colorMapSampler, which is the same size as th...
The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br />	soft egde를 표현하기 위한 near CoC생성<br />렌...
Color Texture<br />Depth Texture<br />DofNearCoc<br />Texture<br />Gaussian blur<br />3x3 blur<br />DofDownTexture<br />bl...
samplercolorSampler;      // Original source image<br />samplersmallBlurSampler;  // Output of SmallBlurPS()<br />samplerl...
half3GetSmallBlurSample( float2tc )  <br />{  <br />consthalf weight = 4.0 / 17;  <br />half3 sum = 0;  // Unblurred sampl...
Unblurred<br />Small blur<br />Medium blur<br />Large blur<br />half4InterpolateDof( half3 small, half3 med, half3 large, ...
Conclusion<br />픽셀당 8.625샘플링이 필요.<br />large Gaussian blur의 샘플링 카운트를 계산하지 않았을때<br />오리지널 이미지에 있는 픽셀이 1.3125번 쓰인다.<br />¼로 ...
Limitations and Future Work<br />unfocused 오브젝트의 blur가 focus 오브젝트를 가린다.<br />foreground 오브젝트 렌더링 버퍼를 분리해서 극복 가능<br />Trans...
Nächste SlideShare
Wird geladen in …5
×

[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field

2.582 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field

  1. 1. Chapter 28. Practical Post-Process Depth of Field<br />GPU Gems3<br />http://ohyecloudy.com<br />http://cafe.naver.com/shader.cafe<br />
  2. 2. Depth of Field<br />
  3. 3. 용어 정리<br />CoC(Circle of confusion, 착란원)<br />
  4. 4. Overview<br />Post-Process Stage에서 DoF를 구현한다.<br />Depth Texture를 사용<br />depth 값을 사용해 CoC를 구한다.<br />Blur 경계를 부드럽게 표현<br />focused 오브젝트와 unfocused 오브젝트 경계<br />
  5. 5. 공식 유도<br />CoC의 반지름을 구한다.<br />
  6. 6. Imaging<br />Plane<br />lens<br />초점거리 변수focal length<br />
  7. 7. Initial Stochastic Approach<br />The Scatter-as-Gather Approach<br />The Blur Approach<br />Evolution of the Algorithm<br />
  8. 8. original texture<br />Search CoC<br />모든 픽셀의 CoC계산.<br />계산된 CoC를 원본 이미지 샘플링에 사용.<br />원형 푸아송 분포(Poisson distribution)<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정.<br />이 가정이 아니면 주변 픽셀의 CoC를 따져서 샘플링 해야 한다.<br />
  9. 9. sharp silhouettes. <br />Sharp silhouettes<br />Ringing artifacts<br />low-quality 텍스쳐를 사용한 것처럼 나온다.<br />
  10. 10. Initial Stochastic Approach<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정<br /> Sharp shilhouettes, Ring artifact, 텍스쳐 품질 저하.<br />The Scatter-as-Gather Approach<br />The Blur Approach<br />Evolution of the Algorithm<br />
  11. 11. 현재 계산중인 픽셀이 CoC범위에 들지 않으므로 제외<br />original texture<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정.<br />각자 자신의 CoC를 가진다.<br />주변 픽셀을 검색할 때 가장 큰 CoC로 검색<br />주변 픽셀의 CoC가 저마다 다르기 때문.<br />
  12. 12. sharp silhouettes. <br />Sharp silhouettes<br />Ringing artifacts<br />low-quality 텍스쳐를 사용한 것처럼 나온다.<br />블러된텍스쳐 질은 향상<br />
  13. 13. Initial Stochastic Approach<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정<br /> Sharp shilhouettes, Ring artifact, 텍스쳐 품질 저하.<br />The Scatter-as-Gather Approach<br />각 픽셀마다 자신의 CoC를 가진다.<br />첫번째 시도보다는 blur된 텍스쳐 품질은 좋아짐<br />The Blur Approach<br />Evolution of the Algorithm<br />
  14. 14. CoC<br />focus, background<br />CoC = 1<br />¼ down scaling<br />CoC<br />blurred<br />CoC<br />
  15. 15. focused와 unfocused 경계선이 부드럽지 않다.<br />최대 blur와 focused 오브젝트의 경계선은 약 50% blur<br />gradient가 필요.<br />diameter <br />
  16. 16. Initial Stochastic Approach<br />주변 픽셀과 현재 계산중인 픽셀의 CoC가 같다는 가정<br /> Sharp shilhouettes, Ring artifact, 텍스쳐 품질 저하.<br />The Scatter-as-Gather Approach<br />각 픽셀마다 자신의 CoC를 가진다.<br />첫번째 시도보다는 blur된 텍스쳐 품질은 좋아짐<br />The Blur Approach<br />CoC텍스쳐¼ 다운 샘플링 & Blur<br /> gradient로 경계선처리<br />셋 중 가장 만족스러운 결과물<br />Evolution of the Algorithm<br />
  17. 17. Initial Stochastic Approach<br />The Scatter-as-Gather Approach<br />The Blur Approach<br />
  18. 18. 구현 고려 사항<br />Depth Information<br /> R32F Texture<br />Variable-Width Blur<br />Circle of Confusion Radius<br />First-Person Weapon Considerations<br />
  19. 19. piecewise linear curve로 approximate <br />서로 다른 blur radius 3개<br />오리지널 unblurred sample<br />2개의 큰 blur radius<br />다운 샘플링된CoC<br />
  20. 20. 가장 작은 blur radius<br />5번의 texture lookup<br /> 5X5에서 평균 17 픽셀<br />가장 작은 blur<br />실제 blur된 컬러의 approximation<br />연속된 blur 컬러 표현<br />
  21. 21. 구현 고려 사항<br />Depth Information<br /> R32F Texture<br />Variable-Width Blur<br /> blur radius 3개 + unblurred sample<br />가장 작은 blur radius로 실제 컬러 근사, 연속된 blur 컬러 표현<br />Circle of Confusion Radius<br />First-Person Weapon Considerations<br />
  22. 22. Depth Texture에 기록된 Depth 값으로 구한다.<br />더 자유로운 표현을 위해<br /> world-near-end distance<br /> world-far-start distance<br />
  23. 23. 구현 고려 사항<br />Depth Information<br /> R32F Texture<br />Variable-Width Blur<br /> blur radius 3개 + unblurred sample<br />가장 작은 blur radius로 실제 컬러 근사, 연속된 blur 컬러 표현<br />Circle of Confusion Radius<br />앞에서 구한 공식을 그대로 사용하지 않는다.<br />자유로운 표현을 위해 변수 추가<br />First-Person Weapon Considerations<br />
  24. 24. FPS(first-person shooter)게임에서 플레이어 무기 표현은 매우 중요<br />특별 처리<br />view model로 따로 near, far 값을 갖게 한다.<br />world와 view model의 구분<br />view model의 경우 depth를 마이너스 값으로 기록<br />
  25. 25. 구현 고려 사항<br />Depth Information<br /> R32F Texture<br />Variable-Width Blur<br /> blur radius 3개 + unblurred sample<br />가장 작은 blur radius로 실제 컬러 근사, 연속된 blur 컬러 표현<br />Circle of Confusion Radius<br />앞에서 구한 공식을 그대로 사용하지 않는다.<br />자유로운 표현을 위해 변수 추가<br />First-Person Weapon Considerations<br />특별처리, Depth는 음수값으로 기록<br />
  26. 26. The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br />soft egde를 표현하기 위한 near CoC생성<br />렌더타겟은씬의¼ 사이즈<br />Pixel Shader That Calculates the Actual Near CoC<br />Blurs the Near CoC and Downsampled Color Image Once<br />Merges the Far CoC with the Near CoC and Applies It to the Screen<br />
  27. 27. structPixelInput<br />{<br />float4 position : POSITION;<br />float2 tcColor0 : TEXCOORD0;<br />float2 tcColor1 : TEXCOORD1;<br />float2 tcDepth0 : TEXCOORD2;<br />float2 tcDepth1 : TEXCOORD3;<br />float2 tcDepth2 : TEXCOORD4;<br />float2 tcDepth3 : TEXCOORD5;<br />};<br />PixelInputDofDownVS( float4 pos : POSITION, float2tc : TEXCOORD0 )<br />{<br />PixelInput pixel;<br />pixel.position = mul( pos, worldViewProj );<br /> pixel.tcColor0 = tc + float2( -1.0, -1.0 ) * invRenderTargetSize;<br /> pixel.tcColor1 = tc + float2( +1.0, -1.0 ) * invRenderTargetSize;<br /> pixel.tcDepth0 = tc + float2( -1.5, -1.5 ) * invRenderTargetSize;<br /> pixel.tcDepth1 = tc + float2( -0.5, -1.5 ) * invRenderTargetSize;<br /> pixel.tcDepth2 = tc + float2( +0.5, -1.5 ) * invRenderTargetSize;<br /> pixel.tcDepth3 = tc + float2( +1.5, -1.5 ) * invRenderTargetSize;<br />return pixel;<br />}<br />
  28. 28. constfloat2dofRowDelta;// float2( 0, 0.25 / renderTargetHeight )<br />half4DofDownPS( constPixelInput pixel ) : COLOR<br />{<br />rowOfs[0] = 0;<br />rowOfs[1] = dofRowDelta.xy;<br />rowOfs[2] = dofRowDelta.xy* 2;<br />rowOfs[3] = dofRowDelta.xy* 3;<br />// Use bilinear filtering to average 4 color samples for free.<br />half3 color = 0;<br /> color += tex2D( colorSampler, pixel.tcColor0.xy + rowOfs[0] ).rgb;<br /> color += tex2D( colorSampler, pixel.tcColor1.xy + rowOfs[0] ).rgb;<br /> color += tex2D( colorSampler, pixel.tcColor0.xy + rowOfs[2] ).rgb;<br /> color += tex2D( colorSampler, pixel.tcColor1.xy + rowOfs[2] ).rgb;<br /> color /= 4;<br />// Process 4 samples at a time to use vector hardware efficiently.<br />// The CoC will be 1 if the depth is negative, so use &quot;min&quot; to pick<br />// between &quot;sceneCoc&quot; and &quot;viewCoc&quot;.<br /> depth[0] = tex2D( depthSampler, pixel.tcDepth0.xy + rowOfs[0] ).r;<br /> depth[1] = tex2D( depthSampler, pixel.tcDepth1.xy + rowOfs[0] ).r;<br /> depth[2] = tex2D( depthSampler, pixel.tcDepth2.xy + rowOfs[0] ).r;<br /> depth[3] = tex2D( depthSampler, pixel.tcDepth3.xy + rowOfs[0] ).r;<br />half4viewCoc = saturate( dofEqWeapon.x * -depth + dofEqWeapon.y );<br />half4sceneCoc = saturate( dofEqWorld.x * depth + dofEqWorld.y );<br />half4curCoc = min( viewCoc, sceneCoc );<br />half4coc = curCoc;<br />// rowOfs[1], rowOfs[2], rowOfs[3]<br />halfmaxCoc = max( max( coc[0], coc[1] ), max( coc[2], coc[3] ) );<br />returnhalf4( color, maxCoc );<br />}<br />
  29. 29. Color Texture<br />Depth Texture<br />DofDownTexture<br />
  30. 30. The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br /> soft egde를 표현하기 위한 near CoC생성<br />렌더타겟은씬의¼ 사이즈<br />Pixel Shader That Calculates the Actual Near CoC<br />경계선을 부드럽게 할 수 있도록 CoC 계산<br />Blurs the Near CoC and Downsampled Color Image Once<br />Merges the Far CoC with the Near CoC and Applies It to the Screen<br />
  31. 31. // These are set by the game engine.<br />samplershrunkSampler; // Output of DofDownsample() <br />samplerblurredSampler; // Blurred version of the shrunk sampler<br />// This is the pixel shader function that calculates the actual<br />// value used for the near circle of confusion.<br />// &quot;texCoords&quot; are 0 at the bottom left pixel and 1 at the top right.<br />float4DofNearCoc( constfloat2texCoords )<br />{ <br />half4shrunk = tex2D( shrunkSampler, texCoords );<br />half4blurred = tex2D( blurredSampler, texCoords );<br />float3color = shrunk.rgb;<br />float coc = 2 * max( blurred.a, shrunk.a ) - shrunk.a;<br />returnfloat4( color, coc );<br />}<br />shrunkSampler<br />blurredSampler<br />DofDownTexture<br />blurred<br />DofDownTexture<br />Gaussian blur<br />
  32. 32. The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br /> soft egde를 표현하기 위한 near CoC생성<br />렌더타겟은씬의¼ 사이즈<br />Pixel Shader That Calculates the Actual Near CoC<br />경계선을 부드럽게 할 수 있도록 CoC 계산<br />Blurs the Near CoC and Downsampled Color Image Once<br />3x3 blur를 사용해 실제로 경계선을 부드럽게 한다.<br />Merges the Far CoC with the Near CoC and Applies It to the Screen<br />
  33. 33. // This vertex and pixel shader applies a 3 x 3 blur to the image in<br />// colorMapSampler, which is the same size as the render target.<br />// The sample weights are 1/16 in the corners, 2/16 on the edges,<br />// and 4/16 in the center.<br />samplercolorSampler;// Output of DofNearCoc()<br />float2invRenderTargetSize;<br />structPixelInput<br />{<br />float4 position : POSITION;<br />float4texCoords : TEXCOORD0;<br />};<br />PixelInputSmallBlurVS( float4 position, float2texCoords )<br />{<br />PixelInput pixel;<br />constfloat4halfPixel = { -0.5, 0.5, -0.5, 0.5 };<br />pixel.position = Transform_ObjectToClip( position );<br />pixel.texCoords = texCoords.xxyy + halfPixel * invRenderTargetSize;<br />return pixel;<br />}<br />float4SmallBlurPS( constPixelInput pixel )<br />{<br />float4 color;<br /> color = 0;<br /> color += tex2D( colorSampler, pixel.texCoords.xz );<br /> color += tex2D( colorSampler, pixel.texCoords.yz );<br /> color += tex2D( colorSampler, pixel.texCoords.xw );<br /> color += tex2D( colorSampler, pixel.texCoords.yw );<br />return color / 4;<br />}<br />
  34. 34. The Complete Algorithm<br />Downsamples the Scene and Initializes the Near CoC.<br /> soft egde를 표현하기 위한 near CoC생성<br />렌더타겟은씬의¼ 사이즈<br />Pixel Shader That Calculates the Actual Near CoC<br />경계선을 부드럽게 할 수 있도록 CoC 계산<br />Blurs the Near CoC and Downsampled Color Image Once<br />3x3 blur를 사용해 실제로 경계선을 부드럽게 한다.<br />Merges the Far CoC with the Near CoC and Applies It to the Screen<br />varialbe-width blur 적용<br />모든 color sample의 alpha를 1로 가정<br />읽지 않은 center 샘플을 color가 0이고 alpha가 0인 픽셀로 처리<br />
  35. 35. Color Texture<br />Depth Texture<br />DofNearCoc<br />Texture<br />Gaussian blur<br />3x3 blur<br />DofDownTexture<br />blurred<br />DofDownTexture<br />SmallBlurTexture<br />largeBlurSampler<br />smallBlurSampler<br />
  36. 36. samplercolorSampler; // Original source image<br />samplersmallBlurSampler; // Output of SmallBlurPS()<br />samplerlargeBlurSampler; // Blurred output of DofDownsample()<br />half4ApplyDepthOfField( constfloat2texCoords ) <br />{ <br />halfcoc; <br />half3 small = GetSmallBlurSample( texCoords ); <br />half4 med = tex2D( smallBlurSampler, texCoords ); <br />half3 large = tex2D( largeBlurSampler, texCoords ).rgb; <br />half nearCoc = med.a; <br />half depth = tex2D( depthSampler, texCoords ).r; <br />if ( depth &gt; 1.0e6 ) <br /> { <br />coc = nearCoc; // We don&apos;t want to blur the sky. <br /> } <br />else<br /> { <br />// dofEqFar.x and dofEqFar.yspecify the linear ramp to convert <br />// to depth for the distant out-of-focus region. <br />half farCoc = saturate( dofEqFar.x * depth + dofEqFar.y );// dofEqFar.zis the ratio of the far to the near blur radius. <br />coc = max( nearCoc, farCoc * dofEqFar.z ); <br /> } <br />returnInterpolateDof( small, med.rgb, large, coc );<br />} <br />
  37. 37. half3GetSmallBlurSample( float2tc ) <br />{ <br />consthalf weight = 4.0 / 17; <br />half3 sum = 0; // Unblurred sample done by alpha blending <br /> sum += weight * tex2Doffset( colorSampler, tc, +0.5, -1.5 ).rgb; <br /> sum += weight * tex2Doffset( colorSampler, tc, -1.5, -0.5 ).rgb; <br /> sum += weight * tex2Doffset( colorSampler, tc, -0.5, +1.5 ).rgb; <br /> sum += weight * tex2Doffset( colorSampler, tc, +1.5, +0.5 ).rgb; <br />return sum; <br />} <br />float4 tex2Doffset( sampler s, float2tc, float2 offset ) <br />{ <br />returntex2D( s, tc + offset * invRenderTargetSize ); <br />} <br />
  38. 38. Unblurred<br />Small blur<br />Medium blur<br />Large blur<br />half4InterpolateDof( half3 small, half3 med, half3 large, halfcoc ) <br />{ <br />// Efficiently calculate the cross-blend weights for each sample. <br />// Let the unblurred sample to small blur fade happen over distance <br />// d0, the small to medium blur over distance d1, and the medium to <br />// large blur over distance d2, where d0 + d1 + d2 = 1. <br />// dofLerpScale = float4( -1 / d0, -1 / d1, -1 / d2, 1 / d2 ); <br />// dofLerpBias = float4( 1, (1 – d2) / d1, 1 / d2, (d2 – 1) / d2 ); <br />half4weights = saturate( coc * dofLerpScale + dofLerpBias ); <br />weights.yz = min( weights.yz, 1 - weights.xy );<br />// Unblurred sample with weight &quot;weights.x&quot; done by alpha blending <br />half3 color = weights.y * small + weights.z * med + weights.w * large; <br />halfalpha = dot( weights.yzw, half3( 16.0 / 17, 1.0, 1.0 ) ); <br />returnhalf4( color, alpha ); <br />} <br />
  39. 39. Conclusion<br />픽셀당 8.625샘플링이 필요.<br />large Gaussian blur의 샘플링 카운트를 계산하지 않았을때<br />오리지널 이미지에 있는 픽셀이 1.3125번 쓰인다.<br />¼로 다운 샘플링해서 사용<br />렌더타겟6장<br />Gaussian blur가 2패스일때를 가정.<br />
  40. 40. Limitations and Future Work<br />unfocused 오브젝트의 blur가 focus 오브젝트를 가린다.<br />foreground 오브젝트 렌더링 버퍼를 분리해서 극복 가능<br />Transparency를 명확하기 처리 불가능<br />

×