dx11프로젝트 – 아웃라인 쉐이더 및 테셀레이션

아이폰 개발에 신경쓴다고 손놓고 있던 dx11 엔진 프로젝트를 다시 진행하고 있다.

역시 에일리언웨어 노트북의 그래픽카드를 GTX260M에서 GTX460M으로 바꾼게 크게 동기부여가 되었다. PC그래픽카드보다 비싼 43만원짜리 그래픽 카드를 꽂아줬으니 돈은 뽑아야…

집이 더워서 상당 부분 작업을 스타벅스에서 진행했다. 아 커피값이여…

화면 전체에 포스트 이펙트로 아웃라인을 먹이는 방법은 실제 상용 프로젝트에 적용하기엔 문제가 많다.

오브젝트별로 아웃라인을 사용하지 않을지 선별할 수 없다는게 첫번째 문제이다.

둘째로 포그 사용시 포그에도 아웃라인이 들어가게 된다.

그래서 아웃라인 텍스쳐는 따로 두고 투패스로 렌더링했었는데 이렇게 하면 또 문제가 있다.

배경에는 아웃라인을 사용하지 않고 캐릭터에만 사용할 경우 캐릭터의 팔과 몸이 겹치는 부분이나 턱선, 다리가 겹치는 부분 등의 라인이 두껍게 나온다.

배경과 캐릭터가 맞닿는 아웃라인에서 배경쪽에 생겨야 하는 아웃라인이 생기지 않기 때문에 상대적으로 캐릭터 안쪽에서 생기는 아웃라인이 두껍게 나오는 것이다.

이 문제를 해결하기 위해 노말렌더링할때 오브젝트별 아이디를 알파성분으로 렌더링하고 필터링시에 아이디를 판별하는 방법을 사용했었다.

SM2.0의 CMP명령 하나 가지고 처리하느라 애먹기도 했고, 원하는대로 부드럽게 라인이 나오지 않아서 꽤 고생했었다. 아 정말 2년쯤 전에 날밤을 새가며 쉐이더 어셈 명령 하나하나, 상수 하나하나를 튜닝하던 기억이 잊혀지지 않는다.

그때 작성해놓은 쉐이더 어셈코드를 HLSL코드로 바꾸려니 그것도 만만치 않았다. 어찌나 생소하던지…

게다가 텍스체 어드레싱이 DX9에서 DX10/DX11로 가면서 약간 바뀌어서 꽤 헷갈렸다.

하여간 포팅작업은 잘 마무리지었고 아웃라인 쉐이더를 적용했다.

아웃라인 쉐이더 + non 테셀레이션

dx11_non_tess

아웃라인쉐이더+테셀레이션

dx11_tess_pn

캐릭터에만 테셀레이션이 적용되어있고 머리카락 부분이나 가슴부위를 보면 확실히 차이가 난다.

[테셀레이션 + non 테셀레이션 노멀렌더링]으로 조합하면 다음과 같이 테셀레이션 처리된 부분을 확실히 알 수 있다. 외곽선이 꺽이는 부분 테셀레이션 처리된 부분이다.

dx11_ttess_non_tess_normal


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중