카툰랜더링 시도 - 1

참고 포스트 : http://kallru.tistory.com/entry/쉐이더를-사용하지-않고-카툰렌더링-해보기

아무래도, 몇번 더 이 문제에 대한 포스트를 쓸껏 같아서, 제목에 번호를 붙였답니다. 흐흐흐 -_-ㅋ

참고 포스트에 보면, "쉐이더 없이 카툰랜더링 하기" 라는 주제로 소스와 설명이 붙은게 있답니다.

오늘 전 이 소스를 보고 카툰랜더링에 대해서 생각을 해봤지요.

 

그 결과를 적겠습니다.~ 일단 먼저 직접 제 개인적인 프로젝트 파일 따위에 붙이는 작업 같은건 안했습니다. (제 스타일로 커스텀마이징은 안했다는 소리에요) 결론부터 이야기 하자면 "그냥 쉐이더 쓸래" 정도로 마음이 거의 귀울었답니당.

 

저는 쉐이더를 잘 다루거나 하는건 아니에요. HSL 이니 뭐니 하는 그런거 다루지 못합니당.

저 위에 포스트를 분석한 결과 카툰 랜더링이 갖춰야할 2가지 조건 중에 한가지만 갖추었다라고 판단 했습니다.

 

카툰랜더링이라는 넘은 비 실사 랜더링 종류의 한개라고 생각하는데요. 뭐 여턴 카툰랜더링은 두가지를 갖추어야 된다고 생각합니당. 첫번?는 음영입니다. 실사랜더처럼 자연스러운 그라데이션을 가진 음영이 아니라, 단계별로 딱딱 끊어지는 음영이지요.

 

두번째는 바로 외곽선!! (실루엣 엣지) 바로 이녀석이 문제입니다. 위 포스트에서 (쉐이더없이 카툰...) 구현된 부분은 바로 첫번째 부분입니다. 두번째 녀석인 외곽선이 없습니다. 흑흑흑 -_-;

와곽선 검출에 대한 다양한 정보들을 습득해 보았는데, 가장 마음에 드는 기법(??)은 노멀확장이 젤 맘에 들더군요.

 

헌데 자세하고 쉽게 기술해둔 문서를 찾기 어려워서 (거의다 영문서 젠장!! ㅠ_ㅠ)일단 구현은 보류 했답니다. 제가 가지고 있는 책들은 전부 쉐이더로 툰 랜더링을 구현하는데, 쉐이더를 써버리면 위에 포스트의 의미가 없어지지요.

 

OpenGL로 만들어진 툰랜더를 보았는데, 무척 쉽게 구현한 느낌이 들더군요. 밑에 소스는 Loony 라는 예제로, OpenGL로 만든것 같더군요. 제가 OpenGL을 써본적이 없어서 잘은 모르겠지만..

여턴 인용한 소스는 외곽선을 랜더링 하는 부분인데, 저 계산이 전부인듯 하네요 -_-;;;

 

   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

 

   glColor3fv(&m_SilhouetteColor.r); // Set Line Color
   glLineWidth(m_SilhouetteWidth);  // Give it some beef
   glDepthFunc(GL_LEQUAL);   // Draw shared edges
   glPolygonMode(GL_BACK,GL_LINE); // Draw Lines


   glCullFace(GL_FRONT);   // Draw backfacing edges only

   glInterleavedArrays(model->dataFormat,0,(GLvoid *)model->vertexData);
   glDrawArrays(GL_TRIANGLES,0,model->faceCnt * 3);

 

   // Set Everything Back to original settings
   glDepthFunc(GL_LESS);
   glColor3f(1.0f, 1.0f, 1.0f);
   glCullFace(GL_BACK);

 

제 시선을 이끄는 부분은 glLineWidht 함수인데, 인자로 주는 float형으로 외곽선의 굵기를 간단하게 조절 할 수 있더군요.

함수를 전부 직역을 해보면 첨 블랜딩을 키고 -0-;; 알파 블랜을 하고, 어떤 컬러를 설정 한 후 라인 굵기를 설정하고, Depth를 설정하는데, 주석 내용은 잘 모르겠군요 -0-;; (주석에서 이야기 하는 shared는 단순 그 의미일뿐 (퀘이크에 쉐이더 처럼) 음 설명하기 어려움 -_ㅠ)

 

어째~~든, 정리 해보면 이 소스는 와이어 프레임으로 외곽선을 그리는것 같습니다. gpg포럼에서 정보를 뒤저본 결과, 엣지를 검출하고 그리는 방법에는 여러가지 방법이 있는데, 노멀 확장이나 와이어프레임을 그리거나 메쉬를 두번그리거나...오픈쥐엘에서는 와이어프레임의 굵기를 조절 할수 있어서 (DX에서는 안되나봐요) 외곽선을 그리기가 쉽다!! 라고 하더군요.

 

결국.........................도움이 안되잖아 ㅠ_ㅠ 아 와이어프레임으로 외곽선을 그릴때에는 뒤집어서 그려야 된다고 하는것 같네요.

 

밑에 그림은, 위 포스트 (쉐이더 어쩌구!! 제길 -0-) 에서 자체적으로 생성하는 음영 텍스처 (1D텍스처인감)를 확대한 겁니다만, 쉐이더를 사용하는 다른 카툰랜더 소스에서도 이와 비슷한(거의 같은) 텍스처를 쓰더군요. 결국 음영처리에선 1D 텍스처를 이용하는 방법이 제일 효과적인것 같네요.

 


 

[그림을 클릭해서 보세요. 맨 앞에 흰색이 존재함 --;]
칼루
나만의 강의 2006. 8. 8. 17:05
,
Powerd by Tistory, designed by criuce
rss