'픽셀 연산'에 해당되는 글 1건

  1. 2010.03.18 픽셀 연산시 고려해야할 색 공간(The Importance of being Linear)

아래에서 퍼옴
http://eppengine.com/zbxe/programmig/3117

최근 gpu 들의 성능은 사실적인 라이팅 처리를 위한 많은 연산들을 실시간으로 처리한다.
 
하지만 여전히 사실적인 광원처리는 무거운 연산이며, 이러한 연산들을 실시간으로 처리하는데 많은 애로사항이 있다.
 
적절한 gamma 보정은 image quality 를 개선하기 위한 가장 편하고 일반적인 기술이다.
 
그렇다면 적절한 gamma 보정을 위해서는 어떠한 것들이 필요한가?
 
우리가 흔히 이미지를 표현할때 사용되는 대부분의 display 장치들은 sRGB 의 생공간을 사용한다.
 
그러므로 이러한 장치에 알맞게 대부분의 image 들은 sRGB 공간으로 저장되게 된다.
 
sRGB 의 생공간이 linear 한 공간인가? 결론은 아니다.
 
그렇다면 앞서 이야기 한 것과 같이, 대부분의 표현장치들은 nonlinear 한 생공간을 표현하는데,
 
우리의 렌더링 연산은 이러한 생공간이 linear 하다고 가정하고 이루어 진다.
 
여기서 문제가 발생하는데, 이러한 문제로인해 gamma 값이 잘못 표현되게 되고, 이는 사실적인 렌더링을 저해하는
 
요소가 된다.
 
그렇다면 이를 위한 적절한 해결책으로 image 의 imput 값을 아래와 같이 변경한다. ( gamma 2.2 에 근접한다고 가정)

   float3 diffuseCol = pow( f3tex2D( diffTex, texCoord ), 2.2 );  

  or ( 보다더 비용이 적은 방법으로 gamma 값을 2.0에 근접한다고 가정하고 ) 

  •  
  •    float3 diffuseCol = f3tex2D( diffTex, texCoord );  
  •    fuseCol = diffuseCol * diffuseCol;  
  • 그리고는 최종 색정보를 return 할때

       float3 finalCol = do_all_lighting_and_shading();

       float pixelAlpha = compute_pixel_alpha();  

       return float4(pow(finalCol, 1.0 / 2.2), pixelAlpha);

       or

       return float4( sqrt( finalCol ), pixelAlpha );

    위와같이 처리함으로써 다시 sRGB 공간으로 변경하여 리턴한다. ( 이유는 display 장치들은 sRGB 생공간을 사용함으로..)

     
    주의
    컬러 이미지 외에 선형적인 데이터(노멀맵, 스페큘러맵, 하이트맵,...) 들은 이미 linear space 에 있기 때문에
    따로 처리할 필요는 없다.

     참고
    Posted by 노을삼킨별
    ,