강좌를 보기 전에...
Cygwin 설치방법
REYES
Shader 강좌 1
Shader 강좌 2
Shader 강좌 3
Shader 강좌 4
Shader 강좌 5
Shader 강좌 6
Shader 강좌 7
Shader 강좌 8
안녕하세요. 김대현입니다.

오늘은 Renderman의 렌더링 알고리즘에 관해 얘기해 볼까 합니다.
REYES는 'Renders Everything You Ever Saw'를 줄인 말입니다. REYES에 대한 간략한 설명을 드리도록 하죠.

Pasted Graphic 1

1.
모델링 프로그램에서 RIB 생성합니다.
보통 모델링 툴에서 익스포트되는 RIB 메타파일 형태로 사람이 읽을 있는 텍스트 형태입니다.



2. RIB
파일은 Renderman 이해 있는 C API 파싱됩니다.
예전 방식으로 C 직접 구현할 경우 단계는 피할 있지만, 사용상 제약 때문에 요즘은 사용하지 않습니다.



3. Renderman
파싱된 C API들을 호출함으로서 렌더를 시작합니다.



4.
~ 이제 Renderman 내부에서 처리하는 과정을 둘러 봅시다.



5.
모델러에서 만들어 지는 Primitive들은 SubDivision, Polygon, Nurbs, Curve, Particle, Blob등등 다양합니다.
Primitive들에 맞는 바운딩 박스를 계산하여 각각의 Primitive들이 카메라 시점에서 보이는지 계산합니다.
바운딩 박스가 카메라에서 완전히 벗어난 경우 culling 버립니다. 렌더에 사용하지 않습니다.

6.
~ 이젠 모든 Primitive 보이는 것들만 추려냈습니다.



7. Primitive
Shading하기 위해서는 Primitive 적절한 크기일 필요가 있습니다. 만약 Shading하기에 적절한 크기가 아니라면, Split하여 Subprimitive 단계 자릅니다. 이렇게 모든 Primitive 검사하여 Shading하기에 적당한 크기의 Primitive 자르는 작업을 합니다. 그렇다면 Shading하기 적당한 크기란 ? 조금만 기다리세요. 나옵니다.



8.
드디어~ Shading 위한 준비 단계에 들어갈 차례입니다.



9.
다양한 Primitive들은 각각 다른 방식으로 만들어 졌기 때문에 Shading 계산하기 위해 무엇인가 통일된 것으로 만들 필요성이 느껴지지 않나요 ?


10. REYES
대단히 중요한 개념인 micropolygon 나올 차례입니다. Micropolygon 평평한 평면으로 구성되어 있으며, 크기는 거의 Pixel크기입니다. 녀석의 크기는 Renderman ShadingRate 옵션에 의해 결정되죠. 뒤에 자세히 봅시다.


11.
~ 이젠 Primitive들을 Micropolygon으로 만들어 보죠.


12.
Primitive micropolygon으로 구성된 grid 만듭니다. 흡사 Polygon 사각형 형태의 grid Subdivide한다고 보시면 됩니다. 결국 Polygon이던 Nurbs SubDivision 이든 모두 micropolygon 된다는 것이죠. 덕분에 모든 Primitive 단일한 형태의 micropolygon 되어 Shading 계산이 Primitive 별로 있을 필요가 없이 micropolygon 대한 계산 방식만으로 해결되는 군요. 나중에 새로운 방식에 Primitive 나온다고 해도, micropolygon으로 만들 수만 있다면, Shading 문제 없겠네요. 그렇죠 ?


13.
얼마나 잘게 나눌까요 ? 답은 gridsize Renderman 옵션에 의해 결정됩니다. 만약 gridsize 8이라면 8*8 해서 64개의 micropolygon grid 만듭니다. 그렇다면 gridsize 의해 만들어진 micropolygon 크기는 ?


14.
역시나 답은 10 번에서 얘기한 micropolygon 크기를 결정하는 Renderman 옵션인 ShadingRate입니다. ShadingRate 1이면 micropolygon 크기는 1크기의 면적을 갖는 것으로 렌더링의 기본 단위인 1 pixel입니다. 100이면 루트100=10으로 10 Pixel 크기입니다. 100이란 수치는 밑면 * 높이 공식인 사각형 면적 구하는 공식으로 루트를 씌우면 원래 값을 알아 있겠죠 ^^
~ 그렇다는 것은 0.25 답은 ?

그렇습니다. 1 pixel 4개의 micropolygon 들어가겠군요.


그럼 처음으로 돌아가서 gridsize 의해 나누어 봤는데, ShadingRate 면적보다 micropolygon 필요하다면 ?

맞습니다.~ 7번으로 돌아가 Primitive 잘게 자르면 되겠군요. ShadingRate micropolygon 크기가 들어 있는 만큼 계속 자르는 것이죠. 이것이 Primitive Shading 있는 크기 만큼 split하는 핵심적인 요소가 되겠습니다.


15.
가쁘게 달려왔습니다. 잠시 드시고... 다음은 진짜 Shading 단계 돌입입니다. Let's go~!


16.
이젠 촘촘하게 자른 micropolygon 이쁘게 색깔을 입힐 차례입니다.


17.
단계에서 외부에서 작성된 Shader 프로그램이 필요하게 됩니다. 프로그램 작성에 관해서는 다음에 자세히 다루기로 하고, 우선 계속 Shading 통해 최종 color opacity 값을 결정한다고 알고 그냥 달려 보죠~.


18. micropolygon grid
vertex Shader 프로그램으로 color opacity 계산합니다. 참고로 모든 Shading micropolygon grid 단위로 한꺼번에 계산합니다.


19.
그런 다음 micropolygon grid micropolygon 전부 분해(busting)합니다. 이로써 micropolygon grid에서 공유하던 vertex 잘라내서 자신만의 4개의 vertex color opacity값을 갖게 됩니다. 예를 들자면 4개짜리 micropolygon 있을때, 놈들이 grid 상태일때는 vertex 갯수가 9개인데, 분해되면 각자 자기걸 가져가서 16개가 되겠네요.


20.
단계에서 micropolygon 바운딩 박스를 씌워서 다시 카메라에 보이는지 테스트합니다. 단계가 필요할까요 ? 아까 Primitive 바운딩 박스 계산에서 이미 했잖아요 ?


답은 Displacement Shader때문입니다. 기본적으로 Shading 계산할때 Displacement Shader 가장 먼저 계산하고, 그다음 Surface Shader 계산하고, Atmosphere Shader 계산합니다. 그렇다면 Displacement Shader 가장 먼저 오는 이유는 ?

그것은 Displacement Shader Primitive 형태를 변경하기 때문입니다. 형태를 변경하고 surface shading 해야 올바른 모양이 나오겠죠 ? 그렇다는 것은 micropolygon 크기가 작을 수록 Displacement 품질이 훌륭해 지겠군요. 오호라~!

~ 슬슬 번째 질문에 답에 이유를 찾은 하군요. 그렇습니다. Displacement Shader 변형된 micropolygon 카메라 시점에서 벗어날 있다는 것입니다. 곁을 떠난 놈까지 보살필 필요는 없지요 ^^


21.
~ 이젠 만들어진 micropolygon으로 최종 Pixel color opacity 결정해야 시간이군요.


22.
잠시 Pixel 관해 생각해 봅시다. 사진으로 보는 이미지나, 눈으로 보는 이미지는 하나를 구별해 내기 힘듭니다. 하지만, Pixel 경우 아무리 작게 한다고 해도 한계가 있죠. 그렇게 때문에 Pixel 선분을 그었을 , alising 발생하여 선이 거칠어 보입니다. 그렇기 때문에 보통 주변 Pixel 블랜딩하여 antialiasing 시켜주는게 대부분이죠.

aliasing
대한 좋은 예로는 LP 레코드판과 CD 생각해 보면 되겠군요. LP 경우 아날로그 방식이라 중간에 끊김이 없습니다. 하지만, CD 경우 일정한 수치로 아날로그 데이터를 표현해야 하기 때문에 중간 중간 적절한 간격을 가지고 아날로그 데이터에서 값을 가져옵니다. 이것을 Sampling이라고 하죠. 얼마나 자주 아날로그 데이터에서 값을 가져오는가에 따라 Sampling Rate 혹은 Sampling Frequency 결정됩니다.

Sampling Rate
낮을 경우 데이터로 원본 아날로그 데이터를 복원해 내기 힘들어 집니다. aliasing 발생하게 됩니다. 다시 Pixel 돌아가 봅시다. Pixel 경우 사진이나 사람의 눈에 비해 Sampling Rate 무척 낮습니다. Aliasing 발생할 밖엔 없는 것이죠. 그렇다면 해결 방법은 ?

그렇습니다. Sampling Rate 높여 주면 됩니다. 그렇다면 Pixel에서 Sampling Rate 높인다는 것은 무엇을 의미할까요 ?

그건 Pixel 갯수를 늘려주는 것입니다. 하지만, Pixel 갯수를 늘리면 Pixel 크기는 변하지 않기 때문에 이미지의 크기가 늘어나게 됩니다. 그럼, 이미지 크기를 유지하면서 Pixel 갯수를 늘리려면 ?

꽁수를 쓰는 것이죠. Pixel 자체를 여러개의 논리적 단위로 자르는 겁니다. subpixel 만드는 것이죠.

이렇게 하면 내부적으로 데이터의 양은 늘어나겠지만, 실제 이미지에 사용하는 pixel 갯수는 유지되게 됩니다. 그럼 몇개의 subpixel 나눌까요 ?

Renderman
에서 Pixel 분해하기 위한 옵션이 PixelSamples입니다. 각각 가로 세로의 subpixel 갯수를 명시하게 되죠. 예를 들면, PixelSamples 2 2 Pixel 4개의 subpixel 나눈다는 뜻입니다.

물론 aliasing 제거하고 싶지 않다면, PixelSamples 1 1 하여 Subpixel pixel 일치시켜 주면 되겠네요. antialiasing 해주고 싶다고 PixelSamples 무조건 늘리지도 마세요. 단계가 늘어날때마다 마치 바이러스가 번식하듯 데이터의 양이 폭발적으로 늘어 납니다. , 메모리와 렌더 속도를 느리게 하는 원인이죠. 렌더 퀄리티와 메모리, 속도를 적절히 조절해 주는 센스가 필요합니다.


23.
이제 micropolygon에서 최종 pixel color opacity 추출해 단계입니다.


24. subpixel
에서 사용할 색상을 우선 추출해야 겠네요.


25. subpixel
안에는 여러개의 micropolygon 있을 수도 있고, 겹쳐 있을 수도 있고, 없을 수도 있습니다. 이들 micropolygon 어떤 녀석을 골라서 subpixel 색상으로 쓰면 될까요 ?


26.
간단히 생각해서 subpixel 가운데 있는 micropolygon 찾아서 쓰면 되겠네요. 하지만 경우 전체 이미지 결과를 봤을때, 규칙적인 위치에서 값을 가져 오기때문에 모아레 현상이 나타날 있습니다. aliasing 기껏 없애 놨더니 모아레가 생긴다면 걱정이죠. 방법이 없을까요 ?


27.
있습니다. 없겠습니까 ? subpixel 랜덤한 위치에서 micropolygon 가져오면 되겠군요. 물론 이렇게 해도 모아레가 없어지는 아니지만, 미련한 사람 눈으로는 구별하기 힘들어 진답니다.


28.
옵션이 있겠네요. 그렇죠 ? Renderman Hider옵션에 보면 jitter 라는 옵션이 있습니다. Hider "hidden" "jitter" 1 하면 랜덤하게 가져오고, 0으로 하면 가운데서 가져옵니다.


29.
색상을 가져올 micropolygon 선택했습니다. 그런데, 놈이과 다른 놈이 겹쳐 있다면 어떤 놈을 선택해야 하죠 ?

답은 녀석이 opacity값에 따라 다릅니다. 불투명한 녀석이라면 Z buffer 따라 자신의 밑에 있는 micropolygon 날려버리죠. 하지만, 투명하다면 opacity 값을 적절히 적용하여 밑에 있는 놈과 color값을 blending합니다.

그럼 micropolygon color 무엇이죠 ? 아까 18번에서 micropolygon vertex 단위로 Shading 계산했잖아요. 그럼 micropolygon 판떼기의 색은 도대체 어디에 있어요 ?

답은 2개입니다.

첫번째는 vertex 4개의 값을 blending하여 하나의 color 값을 찾고, 값으로 face color 결정하는 것이죠. Flat Shading이라고 보시면 되겠군요.

두번째는 vertex 값으로 face 내부의 color interpolation하는 것입니다. Smooth Shading혹은 Gouraud Shading이라고 하죠. 이걸 이용해서 ShadingRate 값을 높이고도 Smooth 처럼 Fake 있죠.

Renderman
옵션은 ShadingInterpolation "smooth"입니다. flat Shading ShadingInterpolation "constant"입니다.


30.
~ micropolygon color 알아냈습니다. 이젠 최종 pixel 만들기 위해 subpixel들을 하나의 Pixel blending해야 겠군요.


31. micropolygon
경우 크기가 무척 작은게 보통이기 때문에 Flat이나 Gouraud Shading만으로도 훌륭한 color값을 추출할 있습니다. 하지만, 우리가 보는 pixel 훨씬 크죠. 그럼, 퀄리티를 높이기 위해서는 다양한 방식의 blending 필요하겠네요.


32.
이것이 바로! PixelFilter 옵션입니다. 단순한 box 부터 시작하여 triangle, catmull-rom, gaussian, sinc등의 방법이 있습니다. 각각의 느낌은 수치적으로 표현하기 힘듭니다. 직접 사용해 보세요. PixelFileter 옵션에 수치가 PixelSamples 수치와 일치하는 것이 의미심장하게 다가오지 않나요 ?


33.
~ 마침내 REYES 여행이 끝났습니다. 어떠셨나요 ? Renderman 옵션의 숨은 뜻을 약간 있는 기회가 되었으면 좋겠네요.





다음 시간에는 Renderman 사랑할 수밖에 없게 만드는 Shading Language 관해 얘기해 보겠습니다.

수고하세요.