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...
Upcoming SlideShare
Loading in …5
×

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

2,258 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,258
On SlideShare
0
From Embeds
0
Number of Embeds
421
Actions
Shares
0
Downloads
24
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

[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 />

×