Computer Game Architecture 2 - Illumination & Shaders, Textures

 Rendering pipeline : geometry & image as input (which is composed with triangle meshes) -> each vertex operations calculate position (transformations) & color (lighting) (by vertex shades in GPU) -> convert triangles into pixels by rasterization -> do fragment operation for each of pixels (by fragment shader, determine the color of pixel, done by vertex color's interpolation + image texture color)

Illuminations
- local illumination model(direct light) : only consider the point light source and the object reflecting the light.
그러나 현실에는 다른 곳에서 반사되어 눈에 들어오는 indirect light도 존재하므로 이는 현실을 나타내는 global illumination과는 차이가 있다. 그러나 빠른 계산을 위해 일반적으로 local만 고려한다. 또한 현실에서는 point light source는 존재하지 않으므로 area를 나타내기 위해 여러 point를 합쳐서 사용한다.
- shading : determine the intensity of illumination of surface point (위에서 색을 정하는 방법)


Approximate simple local illumination model = diffuse + specular + ambient
- diffuse component : smooth change of illumination
calculated based on Lambert's Law, (표면으로 입사되는 빛이 모든 방향으로 동일하게 반사되는 것을 가정) so it's view independent. 그리고 brightness는 표면에 normal vector와 light direction의 코사인으로 결정된다. (수직으로 비추면 각도 =0 -> 가장 밝음, 평행하게 비추면 각도 = 90 -> 반사 0, 이는 단위 면적 당 비추는 빛의 flux를 생각해보면 바로 알 수 있다)

- specular component : small highlight, mirror like reflection by Phong illumination model.
위와 반대로 입사되는 방향과 반대 방향으로 반사되는 것을 상정하여 계산하므로 view direction에 dependent하다. 따라서 reflection light와 view point의 각도를 통해 계산할 수 있다. (이 경우 두 벡터 모두 normal이 아닌 그냥 방향 벡터로 계산하므로 각도가 0일 때 max, 수직일 때 min. 당연하게도, 반사되는 방향을 바라보면 가장 밝게 보임)

이는 위와 달리 값이 매우 작으므로  roughness  P를 exponent 취하여 계산한다. (P가 작으면 반사되는 각이 좁아 하이라이트 영역이 작고 밝아지며, p가 크면 각도가 커서 하이라이트가 넓어지고 밝기는 줄어든다)

- ambient component : show the environment light (how bright it is), background glow that illuminates all object. indirect light를 단순화하여 나타낸 것으로 보는 방향이나 표면의 벡터에 상관없이 항상 같은 값을 가진다.

R = Ka*I + Kd * I * max(L * n, 0) + Ks * I * max(r * v, 0) ^p
I , L , v는 빛의 방향 정보, Ka, Kd, Ks와 P는 해당 object의 표면 정보이다. 이러한 illuminate color는 각 vertex에서 계산된다.


Shading : pixel color를 결정하는 것
- Flat shading : single normal vector for each triangle, Faceted appearance
위의 R 식을 보면, 같은 물질의 다른 vertex라면 그 차이를 결정하는 것은 각 triangle의 normal vector 뿐이다. 따라서 각 triangle의 normal vector만 고려하는 것이 flat shading 방법이다.


- Gouraud shading :
그러나 위의 방법은 각 triangle의 수직 벡터만 고려하므로 각각의 면이 각진 형태를 띄게 된다. 따라서 triangle이 아니라 triangle을 구성하는 각 vertex의 수직 벡터를 고려하여 계산을 한다. 그리고 pixel에 대해서는 각 vertex를 linear interpolate을 하여 가중치를 두어 계산하게 된다. 따라서 모델이 coarse 한 mesh를 가져도 interpolate에 의해 내부는 자연스럽게 된다. 그러나 specular reflection highlight를 나타내기에는 적합하지 않다. (왜냐하면 coarse한 mesh에서 highlight가 triangle보다 작아버리면 vertex는 그 값을 측정할 수 없고, 내부는 interpolate해서 결정되므로 그 highlight가 무시되게 된다. triangle보다 큰 highlight가 있다 하더라도 interpolate의 특성상 정확하게 표현될 수 없다)

- Phong shading
illumination을 pixel에서 계산하는 방법으로 각 pixel에서 normal vector를 계산하기 어려우므로 각 vertex에서 normal vector를 interpolate 하여 각 pixel의 normal vector를 계산하고, 이를 사용하여 shader를 결정하는 방법이다. 위의 두 방법보다 정확하지만 각 픽셀마다 계산이 필요하므로 당연히 비용이 증가하게 된다.
이 방법은 vertex shader에서 rasterization과 interpolate를 계산하고, fragment shader에서 light를 결정하는 방식으로 이루어진다. (위의 방법들은 vertex shader에서 light를 결정하고 그 다음 과정을 시행함)

 

* 빛이 태양과 같이 매우 멀리 있다면 모든 물체에 같은 방향으로 비춰진다고 가정할 수 있다. (directional light) 그러나 광원이 물체와 일정 거리 이내라면 물체마다 빛이 비춰지는 방향이 달라질 것이므로 해당 위치에 광원을 위치해야 한다. (positional light) 


Texture & Surface detail : surface에 패턴을 새기는 방법.
solid color는 rasterization으로 추가되며 light & shading은 각각의 모델에 의해 결정된다. 그러나 표면에 새겨진 무늬와 같은 것들을 앞서 방법으로 계산하려면 많은 노력이 필요하다. ( 각 triangle에 모든 계산을 해야 하므로) 따라서 이미지 자체를 표면에 추가하여 사실적인 효과를 더욱 간단하게 주는 방법이 바로 텍스쳐를 사용하는 것이다.

- Texture mapping
surface detail, color, surface texture를 3d model에 2d image를 사용하여 추가하는 방법.
이런 텍스쳐 매핑은 평면 이미지를 triangle에 매치 시켜야 하므로 texture의 알맞은 부분에 좌표를 설정하고, 각각을 vertex로 옮기는 작업이 필요하다.
픽셀의 색을 결정할 때는 앞서 계산한 lighting과 texture color를 합쳐서 자연스러운 표현이 가능하다. (modulation)

만약 texture map이 오브젝트보다 작은 경우, repeating이나 wrapping을 사용하는데, repeating은 좌표를 넘어서기 전 마지막 값을 모두 적용하는 것이고, wrapping은 같은 map을 계속 반복하여 적용하는 것이다. (0~1 이후 값을 계속 1로 사용하거나, 0~1을 다시 반복하거나)

또한 texture pixel (Texel)과 frame buffer의 pixel 위치가 서로 다른 경우(크기가 차이나는 경우) 어느 색을 사용할 지 결정해주어야 한다. nearest 방법은 그냥 가장 가까운 것을 사용하는 법이고, linear는 주위의 픽셀을 모두 interpolate 하여 frame buffer color를 결정하는 방법이다.

Linear 방법을 사용하면 Aliasing problem을 줄일 수 있다. (왜냐하면 보간을 통해 부드러운 변환이 가능하므로) 단 texel이 더 작을 때만 성립한다. (일정한 패턴이 표기되어도 저게 더 작으면 pixel 단위로 찢어지게 보인다. 흔히 깨져보인다고 말하는 것이 이 현상이다.) 이럴 경우 모든 vertex를 평균 내야 되는데 너무 오랜 시간이 걸린다.
*Aliasing problem : jagged appearance가 나타나는 그래픽 에러로 색이 급격하게 변하여 찢어지는 것 처럼 보이는 현상이다. (그래픽 깨짐)

Mip-Mapping
위의 문제를 해결하기 위해 precomputed average & build hierarchy를 가지는 texture map을 적용하는 것. (power of 2)
이렇게 하면 texel과 frame pixel의 너무 큰 차이가 나지 않아 위와 같은 문제점을 해결할 수 있다. 물론 이경우에도 nearest나 linear interpolation을 통해 어느 pixel 사이즈를 결정할 수 있다.

Curved Surface
사각형이나 구와 같이 간단한 형상은 parameterization을 통해 texture를 오브젝트에 매핑할 수 있다. 그러나 복잡한 형상은 좌표를 간단하게 극좌표계 혹은 극원통좌표계를 사용하여 붙일 수 없다.

따라서 이런 것은 오브젝트와 구/실린더 사이의 intermediate surface를 생성하여 object surface에 붙이는 방식을 사용한다. (O mapping)
이 방법도 object surface에 수직하게, object의 중심에 가도록, intermediate surface normal, reflected view ray 등 다양한 방법을 사용하여 매핑할 수 있다.

* unfolding : object를 잘라서 전개도 처럼 펼쳐 mapping 하는 방법. Atlas : 위의 unfolding을 하나의 전개도로 펼치면 낭비되는 공간이 많으므로 부분부분 나누어 공간 효율을 올리는 방법.

- Environment mapping : 위의 O-mapping에서 주위 환경을 같은 방법으로 매핑하면 주변 환경이 마치 해당 오브젝트에 비쳐보이는 것 같은 효과를 줄 수 있다. (reflected view ray)


댓글

이 블로그의 인기 게시물

Operating System 8 - Mutex lock

Object Oriented Programming 3 - Template

Data Structure 11 - Queue(4)