최상단 광고

2012년 4월 9일 월요일

간단한 수묵 랜더링


"GPU-based Rendering and Animation for Chinese Painting Cartoon" 이라는 논문 중 일부를 간단하게 구현해보았다.

먼저 표현할 모델은 비교적 간단하게 표현할 수 있는 아래 사과 메쉬를 사용하였다.

사용자 삽입 이미지
예제가 되는 사과 모델

수묵화의 가장 큰 특징인 먹이 번진듯 한 농담 표현과 두꺼운 선을 간단하게 적용해보았다.

언급한 두 특징을 이용하여 렌더링 순서를 정리하며 아래와 같다.
첫째. 전체적으로 윤곽은 크고 두껍게 표현한다.
둘째. 농담은 4단계로 표현하되 농담과 농담 사이는 부드럽게 한다.
셋째. 두 결과 이미지를 혼합하여 최종 결과물을 얻는다.

첫 번째, 크고 두꺼운 윤곽 표현

카툰렌더링과는 다르게 윤곽이 크고 두껍게 표현되어야 하기 때문에 따로 Edge 추출 방법을 쓰지 않고, 광원의 위치를 카메라의 위치와 일치 시키고 퐁 셰이딩(Phong Shading)으로 렌더링 한 결과로 윤곽을 표현하였다. 하지만 퐁 셰이딩으로는 완전히 윤곽을 잡아낼 수 없어서 대략 0.3~0.7(Min 0.0 ~ Max 1.0)값을 골라내서 Linear Interpolation 적용하였다.

사용자 삽입 이미지
뽕 셰이딩(Phong Shading) 결과
사용자 삽입 이미지
Linear Interpolation 결과

(빠른 작업을 위해 Phong shading 대신 N·L (Normal Vector · Light Vector) 로 구현하였다.)

이렇게 나온 결과물을 그냥 사용하기엔 가장자리가 너무 날카롭기 때문에 LPF(Low Pass Filter)로 부드럽게 처리하였다.

사용자 삽입 이미지
LPF가 적용된 윤곽 추출 결과


두 번째, 농담 표현

다시 광원을 원 위치로 옮기고 Phong Shading을 적용한다.
이전 카툰 렌더링은 간단하게 코드상에서 양자화 했지만 이번에는 농담별로 값이 다르기도 하고 농담 사이도 부드럽게 처리해야 하기 때문에 양자화 대신 텍스쳐에서 농담값을 불러와서 사용하였다. (아래 이미지 참조)

사용자 삽입 이미지
농담 값 텍스쳐

위 이미지를 먼저 Phong Shading한 값과 맵핑시켜 아래와 같은 결과를 얻을 수 있었다.
사용자 삽입 이미지
기본 광원 결과
사용자 삽입 이미지
농담 텍스쳐 처리 결과

하지만 이 결고 또한 가장자리가 날카롭기 때문에 윤곽과 같이 LPF를 적용하였다.
사용자 삽입 이미지
Low Pass Filter를 적용한 농담 결과

세 번째, 윤곽 결과물고 농담 결과물 혼합 및 마무리

위에서 먼저 얻은 두 결과물을 혼합하면 아래와 같은 결과를 얻을 수 있다.
(결과물 혼합은 각각의 픽셀과 픽셀을 곱하여 얻어낸다.)
사용자 삽입 이미지
윤곽 + 농담


하얀 배경으로는 수묵화 느낌을 살리기엔 허전한 부분이 존재한다.
그래서아래 그림과 같은 종이 표면같은 텍스쳐를 배경으로 사용해 보았다.
사용자 삽입 이미지
종이 텍스쳐


두 효과의 혼합 결과물과 종이 텍스쳐를 혼합한 최종 결과물은 아래와 같다.
사용자 삽입 이미지
최종 결과

사과 뿐 아니라 다른 모델 또한 위와 같은 작업을 통해 아래와 같은 결과를 얻을 수 있었다.
사용자 삽입 이미지
코끼리
사용자 삽입 이미지
노랑붓꽃
사용자 삽입 이미지
동백

댓글 없음: