<그림 1>
Render to texture 에 관한 예제이다.
윈도우에 직접 Teapot를 렌더링 한 것이 아니라,
우선 윈도우 클라이언트 영역(화면의 검은 부분)과 같은 크기의 텍스쳐를 생성한 후,
그 텍스쳐에 Teapot를 그리고, Quad(Triangle x 2)를 이용하여 텍스쳐 매핑을 수행 한 것이다.
DirectX는 Render to texture에 관한 여러가지 보조 함수가 있으나 OpenGL은 별로 그렇지 못하다.
이렇게 화면에 직접 무엇인가를 그리지 않는 이유에는 몇 가지를 들 수 있다.
<그림 2>
그림 2는 그림 1에서 렌더링된 결과를 이용하여
Mask
0 -1 0
-1 4 -1
0 -1 0
로 Edge detection을 수행한 결과이다.
카툰렌더링에 사용될 Edge를 이런 식으로 구할 수도 있다는 것과,
이미지 프로세싱에 GPU를 사용할 수 있는 간단한 예제 정도로 생각해 볼 수 있다.
윈도우 클라이언트 영역과 같은 크기의 텍스쳐를 생성해야 된다는 점,
이미지 프로세싱에 걸리는 오버헤드(텍스쳐 크기에 비례하는) 등을 고려 할 필요가 있다.
Shader code는 다음과 같다.
float4 PixelShader(float2 tex0 : TEXCOORD0) : COLOR{
float4 c= 0;
for(int y=0; y<3; y++){
for(int x=0; x<3; x++){
float2 texC;
texC.x= tex0.x + (x-1) * invWidth;
texC.y= tex0.y + (y-1) * invHeight;
c+= tex2D(TexS, texC) * gMask[y][x];
}
}
return c;
}
최종 색상(하나의 픽셀 색상, c)을 결정하기 위해 위와 같은 연산이 수행된다.
invWidth, invHeight는 각각 1/Width, 1/height를 나타낸다.
이렇게 하는 이유는,
다음을 생각해 보면 알 수 있다.
이미지 상에서 (x, y)픽셀의 오른쪽 필셀을 (x-1, y)로 나타낼 수 있다.
하지만 텍스쳐 좌표는 0.0 ~ 1.0 까지 이므로 이와 같이 나타 낼 수 없는 대신,
한 픽셀의 비율로서 표현 할 수 있다.
1을 width, height로 각각 나누는 이유는 '한 픽셀이 어느정도의 비율을 갖는가?'
를 계산하는 것이다.
당연한 말이 되겠지만 1/width는 화면의 크기가 바뀌지 않는 이상 변함이 없으니,
굳이 GPU 상에의 계산은 불필요 하므로 화면의 크기가 바뀔때, CPU에서 계산하여 그
값을 GPU에 넘긴다.
'Computer > Graphics' 카테고리의 다른 글
Motion Blur? (0) | 2008.12.05 |
---|---|
수묵화 렌더링(?) (0) | 2008.11.02 |
Slide (0) | 2008.10.22 |
Cartoon rendering (0) | 2008.10.21 |
M: Normal Vector (0) | 2008.10.11 |