프로그래밍 2019. 9. 5. 23:34
728x90

쉐이더 외곽선 구현 1장

 

 

온전히 렌더타겟만을 이용한, 후처리 외곽선 만들기를 살펴보자

 

일단 보기에 좋고,

항상 균등한 넓이의 외곽선이 되고,

구현이 쉬우며,

속도도 빠르다 (원래 외곽선 만드는 것이, 그리 속도를 잡아먹는 렌더링은 아니지만 어쨋든)

 

 

 

 

카툰렌더링에 사용되는 외곽선 만들기와는 차이가 있다

이것은 온전히 오브젝트를 감싸는 끝부분에만 외곽선을 만들수 있다

 

개념적으로 살펴보자면은,

외곽선이 그려질 오브젝트만을 담은 이미지를 만들고,

이 이미지를 넓게 확장해서 외곽선 영역을 만들어주고,

실제 오브젝트영역을 뺀후,

남는 영역 (확장된 영역) 만을 오리지널 화면에 더해주면 된다

(확장된 영역만이 외곽선으로 남으니, 오브젝트의 끝부분에만 외곽선이 그려진다)

 

화면 크기의 렌더타겟을 만들어서

외곽선을 남길 오브젝트를 단색(외곽선 색상)으로 그려넣은 것은 쉽다

 

RT 열고, clear

- 오브젝트 단색 렌더

RT 닫고

 

테스트는 원래 화면 이미지에다 더해서, 출력을 살펴보면 된다

orig.rgb += tex2D( RT, uv );

 

일단은, RT 를 확장하는 것이 고민이었는데,( 외곽선 영역을 만드는것 )

RT보다 약간 크게 렌더링하면 될것이라 생각하였다

 

따라서, RT 와 같은 크기의 RT2 를 추가하고,

RT2 열고, clear

- RT 를 이미지로 사용하여, 화면크기보다 조금 크게 draw 좌표영역을 넓혀서 렌더

( RHW 이미지 그리기를 할때는, 정점 4개의 좌표값을 스케일만큼 직접 키워 계산해서 넣어주면 되고 )

( 3d 좌표를 그려줄때는, ortho view 를 사용, matrix scaling 을 해서 적용 )

RT2 닫고

 

orig.rgb += tex2D( RT2, uv );

로 테스트

 

어라라라,

uv 가 맞지않아서 오브젝트와 딱 겹치지 않고, 이리저리 밀려서 출력된다

당연하다,

화면이 잘려서 RT2 의 uv 는 RT 와 달라지니까

 

그러면, 미리 RT2의 크기를 화면보다 좀더 크게 만들어서

그려질 이미지의 크기를 RT2와 딱맞게 스케일해서 테스트해보면,

 

어라라라,

확장되지 않고, 똑같다

당연하다,

이미지가 아무리 커져도 uv 는 변하지 않으니까

 

어, 이거

스케일로는 답이 안나오는데...

 

그렇다,

RT 속에 든 색상영역을 스케일로는 확장하기가 안된다는것을 깨달았다

이것을 깨닫는데 이틀이 걸렸다...

(여러가지를 테스트 해보았다, 이렇게도 해보고 저렇게도 해보고

왠지 될것 같더란 말이지...)

*혹시 방법이 있고, 그 방법을 아시는분은 꼭 댓글을 부탁드려요, 넘 궁금함

 

 

응, 어쨋든, 그럼 어떻게 해 이거??

 

 

위 스샷에서 보다시피 나는 구현을 했고, 솔루션을 찾았다

눈치있는 프로그래머라면 바로 감이 왔을거 같은데...

 

아직 감이 안왔다면, 

당신은 쉐이더 경험이 부족하다는 거!

 

ㅋㅋㅋㅋㅋ

 

자, 2장에서 살펴보자

 

 

728x90
posted by BK dddDang
: