아래에서 퍼옴
http://allosha.tistory.com/category/니시카와%20젠지/지오메트리%20셰이더
지오메트리셰이더 : 가속을 위한 활용(Stencil Shadow Volume 가속)
2008-09-15 22:05:00
2007年1月、Windows Vistaの登場と共にDirectX 10がリリースされ、同時にプログラマブルシェーダ仕様(SM:Shader Model)は4.0へとバージョンアップがなされた。このSM4.0で最大のトピックといえるのが「ジオメトリシ ...... >> Read more |
(C) Mainichi Communications Inc. All rights reserved.
2007년 1월, 윈도우즈 비스타의 등장과 함께 다이렉트X 10이 릴리즈됨과 동시에 셰이더 사양(SM:Shader Model)은 4.0으로 버전업 되었다. 이 SM 4.0에서 최대 토픽이라 할 수 있는 것이 「 지오메트리셰이더 」(Geometry Shader)이다. 이것은 지금까지 GPU 내부에서는 할 수 없었던 정점을 증가 또는 감소 시킬 수 있는 획기적인 기능이다.
아직 나온지 얼마 되지 않은 기능이라서, 그 응용방법은 현재도 각 개발씬들에서 연구들이 진행되고 있는 상황인데, 서서히 독특한 사용법들이 계속해서 등장하고 있다.
여기에서는 지오메트리셰이더의 대표적인 활용방법 몇가지를 소개한다.
지오메트리셰이더란?
지오메트리셰이더란?
본연재 초반에서도 말한 것처럼, 지오메트리셰이더는 다이렉트X 10 / SM 4.0 환경이 아니면 사용할 수 없다. 다이렉트X10은 윈도우즈 비스타 전용으로 공급되므로, 즉 윈도우즈 비스타 환경이 아니면 사용할 수 없다.
지오메트리셰이더가 하는 일은 프로그램에 따라서 정점을 증가 또는 감소시켜주는 것이다. 정확하게 말하면 선분, 폴리곤(삼각형), 파티클 같은 「프리미티브」를 증가 혹은 감소 시킬 수 있다. 덧붙여서 여담이지만, 지오메트리셰이더는 다이렉트X 10 개발 초기에는 「 프리미티브셰이더 」(Primitive Shader)라고도 많이 불렸다.
<그림 설명>
정점、지오메트리셰이더、프로그램、
(버블 상) 지오메트리셰이더는 셰이더프로그램에 따라 정점을 증가/감소 시키는 일을 한다.
ポリゴン(폴리곤)、
(버블 하) 실질적으로 지오메트리셰이더는 폴리곤이나 선분등을 만들어 낼 수 있다.
그런데, 이 지오메트리셰이더를 사용하면 대체 어떤것이 가능한 걸까?
지금까지 등장한 여러가지 지오메트리셰이더의 활용들을 분류해 보면 2종류로 나눌 수 있다.
하나는 「렌더링 가속을 위한 활용」이고, 또 하나는 「새로운 표현을 위한 활용」이다.
전자는 표현된 결과는 똑같지만, 지오메트리셰이더에 의해서 렌더링 퍼포먼스를 크게 증가 시키기 위한 것이다. 후자는, 지금까지는 실현이 어려웠던 표현이 지오메트리셰이더를 활용해서 쉽게 실현될 수 있다 ……는 것이다.
현재는, 앞에서 이야기 한 것처럼 등장한지 얼마 않되서, 말하자면 지오메트리셰이더의 여명기라고도 할 수 있는 시기여서 어느쪽이라고 말한다면, 전자의 가속을 위한 활용쪽이 더 많은 것 같다.
우선은, 이 「 가속을 위한 활용 」쪽 부터 보도록 하자.
지오메트리셰이더의 가속을 위한 활용 그 첫번째 ~
스텐실 그림자 볼륨 기법의 그림자 생성을 가속한다
지오메트리셰이더의 가속을 위한 활용 그 첫번째 ~
스텐실 그림자 볼륨 기법의 그림자 생성을 가속한다
지난회까지의 「 그림자 생성 」부분에서 다룬 「 스텐실 그림자 볼륨 」기법에서는 광원에서 봤을 때 윤곽이 되는 정점을 광원 벡터 방향으로 잡아 늘여서 그림자 볼륨(그림자 영역)을 생성하는 것부터 시작했다.
SM 3.0 세대까지의 정점셰이더와 픽셀셰이더 밖에 없던 GPU에서는, 이 그림자 영역 생성용의……즉, 잡아 늘일 정점들을 그림자를 생성할 3D모델에 넣어 줄 필요가 있었다. 이 방법에서는 그림자 생성과 아무 관계 없어도 그림자 영역(볼륨)을 위한 정점 계산에 정점셰이더가 사용되기 때문에 부하가 높다. 부하를 감소시키기 위해 그림자 볼륨 생성 전용의, 화면에는 표시하지 않는 로우폴리곤 모델을 준비해서, 이것에 대한 그림자 볼륨을 생성하는 테크닉도 있다. 그러나 이 최적화에서는 그림자의 생성원이 로우폴리곤이기 때문에, 그저 그런 컬리티의 그림자가 생기기 쉽다는 약점이 있다.
근본적으로 문제를 해결하기 위해서는, 동적으로 광원 방향에서 보고 윤곽인가 아닌가를 판단하고, 만일 그렇다면 여기서 그림자 영역용의 정점을 동적으로 생성하면 된다.
지오메트리셰이더를 사용하면 이런 처리가 가능하다. 지금까지 귀찮았던 「볼륨생성용 정점」을 3D모델에 넣어줄 필요가 없고, 또 그림자 영역(볼륨)과 관계 없는 불필요한 정점처리로부터도 해방되어 개발 작업 효율도, 데이터 레벨에도, 퍼포먼스적으로도 가속화가 실현된다. (계속)
지오메트리셰이더 : 가속을 위한 활용(Fur Shader 가속)
3D캐릭터에 털(毛)을 만들어 주는 「 퍼셰이더 」(Fur Shader)라고 불리는 테크닉이 있다.
이 퍼셰이더에는 크게 두가지 방법이 있고, 한쪽 또은 양쪽을 조합해서 사용하는 것이 일반적이다.
가속을 위한 활용(2) ~ 퍼셰이더를 가속한다
가속을 위한 활용(2) ~ 퍼셰이더를 가속한다
하나는 털(毛)을 그린 텍스처를 붙인 폴리곤을 3D캐릭터에 심는 접근방법인 「핀」(Fin:지느러미) 방법이다.
이 기법에서는, 사전에 3D캐릭터에 모를 심듯 털 Fin들을 3D캐릭터 본체에 심어 둘 필요가 있다.
이 방법에서는 털의 유무를 알기가 어려운, 시점에서 멀리 위치한 3D캐릭터에도, GPU는 심은 털을 위한 정점 처리나 픽셀 그리기를 해야 할 필요가 있기 때문에 낭비가 심하다.
지오메트리셰이더를 이용하면, 미리 3D모델에 털을 만들 필요가 없고, 렌더링 시에 리얼타임으로 동적으로
" 털을 심는 " 것이 가능하다.
동적 생성으로 인해 이차적인 메리트도 생긴다.
예를 들면, 3D모델 정보를 만지지 않고도 , 하나의 3D모델을 재사용해 털의 길이나 털의 밀도를 바꾼 3D캐릭터를 렌더링 할 수 있다.
또, 시점에서 멀리 있는 캐릭터에 대해서는 털 Fin을 심는 개수를 줄여서 대충하거나 너무 먼 경우는 털 Fin을 심지 않는 LOD(Level of Detail:시점에서의 거리에 따라 고부하의 처리와 저부하의 처리를 나누어 처리)적인 기능을 구현할 수도 있다.
< 그림 설명>
제목: 핀(Fin)법의 퍼셰이더
상:
털(毛)을 그린 텍스처 폴리곤을 심는다.
(버블) 단, 사전에 3D모델에 심어두지 않으면 않된다.
하:
지오메트리셰이더,
지오메트리리셰이더를 활용하면 런타임 때 털을 심을 수 있다.
핀법의 Fur 표현에서의 라이팅에 대해서는 여러가지가 고안되어 있지만, 가장 단순한 것은 털 Fin에 대해서 간이적인 정점 단위의 라이팅을 하는 것이 비교적 부하가 적고, 자주 사용되는 것 같다.
이것은, 털 Fin에 대해서 광원 방향에 가까운 방위각 부터 명→암의 그라데이션을 걸기만 하는 간단한 방법이다. 털의 밑부분은 다른 털에 의해서 빛이 차단되지만, 이 간이 방법에서는 거기까지 대처할 수가 없기 때문에, 하이라이트가 털의 밑부분 쪽에서는 별로 나오지 않도록 방법을 고안해 줄 필요가 있다.(계속)
<그림 설명>
상:
(박스 좌) 그대로 사용하지 않고
(박스 우) 정점단위의 라이팅을 해준다
명, 암
털 Fin에 대해서 정점단위의 라이팅을 해주면 씬에 동화된 털의 표현이 가능하다.
하:
(버블 좌) 털의 밑부분이 밝게 보일리는 없음에도...
(버블 중, 우) 털의 밑부분이 지나치게 밝지 않도록 바이어스를 걸어두는 게 좋을지도
지오메트리셰이더 : 가속을 위한 활용(Shell법 Fur Shader)
퍼셰이더(Fur Shader)를 가속한다 / 그 두번째~ 쉘법(Shell法) 퍼셰이더
퍼셰이더(Fur Shader)를 가속한다 / 그 두번째~ 쉘법(Shell法) 퍼셰이더
핀법(Fin法)으로 생성된 퍼(Fur, 毛)는, Fur Fin을 측면에 가까운 방향에서 바라볼 경우에는 탐스럽게 많이 늘어진 느낌이 들지만, 털끝이 시선 방향에 가까우면, 즉 Fur Fin을 수직으로 내려다 볼 때는 털의 볼륨감이 사라진다는 약점이 있다.
또 하나의 퍼셰이더는 Fin방법의 약점을 보완하고 극복하는 기법이다.
핀법(Fin法)에서는 털을 세로 방향으로 자른 단면도(斷面圖)를 준비했지만, 또하나의 방법에서는, 나있는 털을 가로방향으로 둥글게 자른 듯한 단면도를 준비해, 이것들을 종이를 겹쳐 쌓는 느낌으로 일정 간격으로 겹쳐서 그려 간다. 둥글게 자른 단면도를 겹처서 원래대로 되돌리는 것 같은 이미지로, 마치 외피(Shell)를 형성하듯이 적층(積層)시키는 듯한 느낌에서, 이런 접근의 퍼셰이더를 「쉘」(Shell)법이라고 부른다. 단면 텍스처로 입체적인 물건을 재구성하는 렌더링 기법에는 볼륨 렌더링이라는 것이 있는데, 이미지적으로는 이것에 가깝다고도 할 수 있다. 덧붙여, 단면도 화상 텍스처에 투명성분(알파성분)를 가미해 반투명(半透明)하게 해서 털의 투명한 감촉을 낼 수도 있다.
<그림 설명>
좌:
단면도 텍스처를 생성(↓)
단면도 텍스처를 붙인 폴리곤을...(↓)
적층(積層)시켜서 그림
우:
(제목) 쉘법(Shell法)의 Fur 셰이더
(버블) 쉘법에서도 사전에 단면텍스처 폴리곤을 적층시킨 3D모델을 준비할 필요가 있다.
ジオメトリシェーダ (지오메트리셰이더)
(버블) 지오메트리셰이더가 있으면 단면 텍스쳐 폴리곤의 적층을 런타임 때 할 수 있다.
쉘법은 단면도를 적당한 간격으로 적층시키지만, 이 간격을 얼마나 조밀하게 다량의 단면도를 적층시킬것인가가 퀄리티를 좌우한다. 적층시키는 매수가 적으면 부식된 것처럼 보이고, 많으면 부하가 커진다. 그다지 시선이 대상물에 가까이 접근하지 않는다면, 최근의 3D게임에서는 4~8층 정도가 일반적인 것 같은데, 시선이 3D캐릭터에 의존할 때는 적층수가 많은 편이 보기에 좋을 것이다.
하지만, 핀법과 마찬가지로 SM 3.0세대까지의 GPU에서는 쉘법 또한 단면도 텍스처를 적용한 폴리곤을, 3D모델에 미리 넣어둘 필요가 있었다.
지오메트리셰이더를 활용하면, 이런 사전 작업 없이, 실시간으로 동적으로 생성하는 것이 가능하다. 또, 시선과 대상물의 위치 관계에 따라서, 단면도 텍스처의 적층수를 증가 또는 감소 시키는 LOD적인 구현도 가능하다.
쉘법에 의해 만들어진 털 |
단면도 텍스처는 단순한 화상 텍스처만으로도 괜찮지만, 함께 대응하는 법선맵(노말맵)도 준비해, 광원 벡터나 시선벡터의 위치 관계에 따라 픽셀 단위의 이방성 라이팅을 해서, Fur에 독특한 광택감을 낼 수도 있다.
라이팅은, Fin 때처럼, 역시 털의 밑부분은 하이라이트가 어둡도록 조정하는 편이 좋을 것이다.
융단과 같이 짧은 털에서는, 시선으로부터 털이 "점"으로 보이는 털끝에는 하이라이트가 약해지고, 반대로 털의 측면 …… 즉 털이 "선"으로 보일 때는 빛이 잘 반사해서 하이라이트가 나오기 쉽다. 이 특성을 구현하려면 , 통상적인 확산 반사 처리에 추가해서, 법선벡터가 시선 벡터와 마주보고 있으면 하이라이트를 약하게 하는 이방성 처리를 하면 좋다. 이 아이디어는 PS 2용 게임 「완다와 거상」에 활용되었다. (계속)
지오메트리셰이더 : 가속을 위한 활용(Fur Shader 응용)
퍼셰이더(Fur Shader)를 가속한다 / 그 3번째 ~ 퍼셰이더의 응용
퍼셰이더(Fur Shader)를 가속한다 / 그 3번째 ~ 퍼셰이더의 응용
쉘법(Shell法)은 핀법(Fin法)과는 반대로, 털끝의 연장선 상에 시선이 있는 것 같은, 시선과 털끝이 마주보는 위치 관계일 때에도, 폭신한 볼륨감을 얻을 수 있는 퍼셰이더이다.
핀법과 쉘법은 서로 보완 관계에 있으므로, 실제로 몸에 털이 짙게 나있는 캐릭터를 리얼하게 표현고자 하는 경우에는 양쪽을 동시에 조합해 사용하는 것이 좋다고 여겨진다.
이것을 지오메트리셰이더 없이 하려면 사전에 Fur(毛) Fin을 심어 놓지 않으면 안되고, 털의 단면도(斷面圖) 폴리곤을 미리 적층(積層) 시켜 놓지 않으면 않되기 때문에 뭔가 일이 커진다.
지오메트리셰이더가 있으면, 두종류의 "털 생성 기법"을 사전준비 없이도 모두 할 수 있다.
좀더 고도의 구현을 하려 한다면, 털을 심을 맨살갗 폴리곤의 법선벡터와, 시선과의 관계를 확인해서, 털의 측면이 보이는 위치에 있는 살갗에는 핀법으로 털을 넉넉하게 적용하고, 털끝과 시선이 마주 보는 위치의 살갗에는 쉘법으로 털을 넉넉하게 해주는 적응형 콤비네이션 퍼(Fur, 毛)도 가능하다.
<그림 설명>
상:
(제목) 퍼셰이더의 적재적소
시점、
(버블 좌) 살갗과 시선이 서로 마주하는 곳에는 쉘법(Shell法)으로
(버블 우) 시선에서 볼 때 윤곽 부근이면 핀법(Fin법)으로
중:
(제목) 퍼세이더의 LOD구현
(좌) 시점에서 가까울 때는 털을 많이
(우) 시점에서 멀 때는 털을 감소 시키면 부하가 준다
하:
(좌) 지오메트리쉐이더 상에서 실루엣 검출
노말벡터 N1과 시선벡터의 내적이 0보다 크고, 노말벡터 N2와 시선벡터의 내적이 0보다 작으면 외곽선
(우) 실루엣 extrusion
N2 노말벡터가 0보다 작으면(실루엣 엣지이면) 두개의 삼각형으로 그것을 extrude
또, 지오메트리셰이더나 정점셰이더 프로그램을 좀더 고도로 만들어서, 털을 바람에 나부끼게 한다든지, 가속이나 감속, 중력이나 완성 등을 고려해, 생성한 털에 애니메이션을 주는 것도 재밌는 응용이 될 것이다. 이 경우, 털끼리의 충돌이나, 털과 다른 오브젝트와의 충돌은 해주기 어렵기 때문에 무시하게 되겠지만, CPU가 개입되지 않아도 털의 애니메이션을 실현시킬 수 있다.
또, 이러한 퍼셰이더는 털을 생성하는 것 뿐만이 아니라, 응용에 따라서 다른 표현에도 사용할 수 있다.
가장 흔한 예가 잡초의 표현이다.
핀법에서 머리카락의 텍스처로 하고 있는 것을 초목의 옆에서 본 면으로해서 이것을 지면에 기르면 밀집한 초목이 완성된다.
또, 쉘법이라면, 단면도 텍스처의 색을 적당한 초록색 계열이나 갈색계열로 해서 지면에 적용하면 잔디와 같은 잎이 짧은 식물이 융단처럼 밀집해서 우거져 있는 지면을 표현할 수 있다.
이 경우에도 바람에 나부끼는 것처럼 하면, 리얼리티는 한층 더 향상된다.
다만, 3D캐릭터가 초목을 밀치고 가는 것과 같은, 동적인 캐릭터와 퍼셰이더로 기른 초목과의 interaction를 취하는 것은 어렵다. 초목의 길이를 너무 길게 하면 잎이 동적 캐릭터의 몸속으로 들어간다거나 하는 부자연스러움이 눈에 띄게 된다.
쉘법으로 생성한 키 작은 초목이면, 동적 캐릭터가 밟은 부분은 적층 간격을 좁힌다든지 또는 퍼(Fur) 자체를 생성하지 않음으로써 발자국의 표현 같은 것은 가능할 것 같다.(계속)
'게임 개발 > 3D 니시가와젠지' 카테고리의 다른 글
수면(水面) 표현 (0) | 2009.12.07 |
---|---|
지오메트리셰이더 : 새로운 표현 (0) | 2009.12.07 |
개량형 깊이 그림자 기법 (0) | 2009.12.07 |
깊이 그림자 기법(Shadow Mapping) (0) | 2009.12.07 |
스텐실 그림자 볼륨 기법(Stencil Shadow Volume) (0) | 2009.12.07 |