본문 바로가기
IT 개발, develop/Image processing

real time rendering 2판

by newly everyday 2015. 9. 16.

출처 블로그>thinkquick님의 블로그 | 뜅퀵

원문 http://blog.naver.com/thinkquick/20020281498

MoinMoin   Real-Time Rendering UserPreferences
 
Help Info Print View Search Diffs Edit
 인덱스   도움말   찾기   대문    바뀐글 

  1. Real-TIme Rednering 2판
    1. 제1장 소개
      1. 1.1 이 책에서 다루는 내용
      2. 1.2 표기법과 정의
        1. 1.2.1 수학 표기법
        2. 1.2.2 기하학적 정의
    2. 제2장 그래픽 렌더링 파이프라인
      1. 2.1 아키텍쳐
      2. 2.2 응용 단계(The Application Stage)
      3. 2.3 기하 단계(The Geometry Stage)
        1. 2.3.1 모델 변환과 시야 변환(Model and View Transform)
        2. 2.3.2 조명 처리와 셰이딩(Lighting and Shading)
        3. 2.3.3. 투영(Projection)
        4. 2.3.4 클리핑(Clipping)
        5. 2.3.5 화면 매핑(Screen Mapping)
      4. 2.4 레스터화 단계(The Rasterizer Stage)
      5. 2.5 파이프라인에 대한 정리
    3. 제3장 변환
      1. 3.1 기본 변환(Basic Transforms)
        1. 3.1.1 평행 이동(Translation)
        2. 3.1.2 회전(Rotation)
        3. 3.1.3 크기 조정(Scaling)
        4. 3.1.4 쉬어(Shear) 변환
        5. 3.1.5 변환의 결합(Concatenation of Transforms)
        6. 3.1.6 강체 변환(The Rigid-Body Transform)
        7. 3.1.7 법선 벡터 변환(Normal Transform)
        8. 3.1.8 역변환 계산
      2. 3.2 특수한 행렬 변환과 연산
        1. 3.2.1 Euler 변환
        2. 3.2.2 Euler 변환으로부터 매개변수 추출
        3. 3.2.3 행렬 분해(Matrix Decomposition)
        4. 3.2.4 임의의 축 주위로 회전 이동
      3. 3.3 사원수(Quaternions)
        1. 3.3.1 수학적 배경
        2. 3.3.2 사원수 변환
      4. 3.4 정점 혼합(Vertex Blending)
      5. 3.5 투영(Projection)
        1. 3.5.1. 직교 투영
        2. 3.5.2 원근 투영
    4. 제4장 시각적 외양(Visual Appearance)
      1. 4.1 광원(Light Source)
      2. 4.2 물질(Material)
      3. 4.3 조명 처리(Lighting)와 셰이딩(Shading)
        1. 4.3.1 난반사 성분(Diffuse Component)
        2. 4.3.2 정반사 성분(Specular Component)
        3. 4.3.3 주변광 성분(Ambient Component)
        4. 4.3.4 조명 처리식(Lighting Equation)
      4. 4.4 앨리어싱과 안티앨리어싱(Aliasing and Antialiasing)
        1. 4.4.1 샘플링과 필터링 이론
        2. 4.4.2 화면 기반 안티앨리어싱
      5. 4.5 투명성(Transparency), 알파값(Alpha), 합성(Composition)
      6. 4.6 안개(Fog)
      7. 4.7 감마 보정(Gamma Correction)
    5. 제5장 텍스쳐 처리(Texturing)
      1. 5.1 일반화된 텍스처 처리(Generalized Texturing)
      2. 5.2 이미지 텍스처 처리(Image Texturiung)
        1. 5.2.1. 확대(Magnification)
        2. 5.2.2 축소(Minification)
      3. 5.3 텍스처 캐싱(Cashing)과 압축
      4. 5.4 다중 패스 텍스처 렌더링(Multipass Texture Rendering)
      5. 5.5 다중 텍스처 처리
      6. 5.6 텍스처 애니메이션(Texture Animation)
      7. 5.7 텍스처 처리 방법(Texture Methods)
        1. 5.7.1 알파 매핑(Alpha Mapping)
        2. 5.7.2 조명 매핑(Light Mapping)
        3. 5.7.3 광택 매핑(Gloss Mapping)
        4. 5.7.4 환경 매핑(Environment Mapping)

Real-TIme Rednering 2판

제1장 소개

1.1 이 책에서 다루는 내용

제2장 그래픽 렌더링 파이프라인(The Graphics Rendering Pipeline)
제3장 변환(Transforms)
제4장 시각적 외양(Visual Appearance)
제5장 텍스처 처리(Texturing)
제6장 고급 조명 처리와 셰이딩(Advanced Lighting and Shading)
제7장 비실사 렌더링(Non-Photorealistic Rendering)
제8장 이미지 기반 렌더링(Image-Based Rendering)
제9장 가속화 알고리즘(Acceleration Algorithms)
제10장 파이프라인 최적화(Pipeline Optimization)
제11장 다각형 처리 기법(Polygonal Techniques)
제12장 곡선과 곡면(Curves and Curved Surfaces)
제13장 교차 검사 방법들(Intersection Test Methods)
제14장 충돌 검출(Collision Detection)
제15장 그래픽 하드웨어(Graphics Hardware)
제16장 미래(The Furture)
부록(Appendix)

1.2 표기법과 정의

1.2.1 수학 표기법
유형 표기법
각도 그리스어 소문자
스칼라 기울임체 소문자
벡터와 점 굵은체 소문자
행렬 굵은체 대문자
평면 π:벡터 +스칼라
삼각형 △세점
선분 양끝점
기하요소 기울임체 대문자
연산자 설명
· 내적
x 외적
v^T 벡터 v의 전치
성분별 벡터 곱셈
단항. prep 내적 연산자
ㅣ·ㅣ 행렬의 판별자
ㅣ·ㅣ 스칼라의 절대값
ㅣㅣ·ㅣㅣ 독립변수의 길이 또는 놈(norm)
n! 계승
(n/k) 이항계수(= n!/k!(n-k)!)

tan(∮) = x
arctan(x) = ∮
C언어 수학함수 atan2(y,x)는 0≤atan2(y,x)<2π 의 범위를 가지며 x≠0일때만 실행이 가능하다.
tan(∮) = y/x
arctan2(y,x) = ∮

이책은 오른손 좌표계(엄지 x축, 집게 y축, 가운데 z축), RGB색상계, 동차 좌표계(homogeneous coordinates)를 사용한다.

1.2.2 기하학적 정의
기본 렌더링 요소는 일반적으로 점, 선, 삼각형이다.
이 책에서는 기하 요소들의 집합을 모델 또는 객체로 부르고
장면은 렌더링될 환경에 포함되어 있는 모든 모델의 집합을 의미한다.
하나의 장면은 물질에 대한 설명, 조명, 그리고 관측 조건등을 모두 포함한다.
하나의 객체는 다수의 렌더링 요소들로 이루어지지만 하나의 객체는 베지어곡선이나 곡면, 분할 표면과 같이 좀더 고차원의 기하학적 표현을 가질수 있다.

[WWW]공식 홈페이지 (www.realtimerendering.com)

제2장 그래픽 렌더링 파이프라인

2.1 아키텍쳐

파이프라인화 되어있지 않는 생산 공정을 n개의 파이프라인으로 나누면 이론적으로 n배의 속도 향상이 일어 난다. 이것이 바로 파이프라인을 사용하는 이유이다.
밑의 도식에서 응용 단계, 기하 단계에서는 파이프라인화가 가능하며 레스터화 단계에서는 부분적인 병렬화도 추가적으로 가능하다.
응용 단계 기하 단계 레스터화 단계

렌더링 속도

초당 프레임 수(fps) 1초에 렌더링되는 이미지의 개수
주파수(Hz) 소요시간의 역수(1/사용된 시간(초단위))

응용 단계에서는 응용 프로그램에 의해 동작되며, 따라서 소프트웨어로 구성된다.
여기에는 충돌 검출, 가속 알고리즘, 애니메이션, 포스 피드백(force feedback)등이 포함될 수 있다.

기하단계에서는 아키텍쳐에 따라서 소프트웨어로 구성될 수도 있고 하드웨어로 구현될 수도 있는데, 여기서는 기하 변환, 투영, 조명 처리 등을 다룬다. 즉, 무엇이 그려질 것인지, 그것이 어떻게 그려질 것인지, 어디에 그려질 것인지가 계산된다.

레스터화 단계에서는 이전 단계에서 생성된 데이터들을 이용하여 이미지를 만들어 낸다.

2.2 응용 단계(The Application Stage)

개발자는 이 단계에서 일어나는 모든것을 완전히 통제할 수 있다. 나머지 단계는 전체 또는 부분적으로 하드웨어로 제작되어 있기 때문에 구현방법을 바꾸는 것은 매우 어렵다.

응용 단계에서 렌더링될 시간을 줄이면 기하 단계, 레스터화 단계에서 소요될 시간을 줄일수 있다.

응용 단계에서 최종적으로 기하 단계로 넘어가는 요소는 점, 선, 삼각형의 렌더링 기본 요소(Rendering Primitive)이다.

소프트웨어 기반으로 구성되는 응용 단계에서는 CPU상의 동작이 이루어 지므로 부분 단계로 분할할 수 없다. 그러나 성능을 향상 시키기 위해서
여러개의 프로세서에서 병렬적으로 실행은 가능하다. 이렇게 동일 단계에서 여러 가지를 실행시키는 것을 CPU 설계에서는 슈퍼스칼라(superscalar)구조 라고 한다. 10.5절에 다중 프로세서를 사용하기 위한 두가지 방법이 있다.

2.3 기하 단계(The Geometry Stage)

다각형이나 정점 단위의 조작이 이루어 진다.

다음과 같은 파이프라인으로 분할 가능하다.

모델 변환과 시각변환 조명 처리 투영 클리핑 화면 매핑

2.3.1 모델 변환과 시야 변환(Model and View Transform)
모델은 고유의 모델 공간이 존재하는데 이것은 정점과 벡터의 기반으로 모델 변환이 이루어지고 나면 월드 공간에 위치하게 된다.
모델 변환은 중복적으로 이루어질 수 있다.

관측자인 카메라 또한 월드 공간에 위치와 방향을 가진다. 시야 변환을 통해서 카메라는 원점을 위치하게 되고 음의 z축 방향을 지향하게 된다.

보통 모델 변환이 이루어 지기 전에 모델과 시야 변환 행렬은 결합이 되어 이루어 지고 카메라가 원점에 위치함에 따라 연산이 단순해지고 빠르게 진행될수 있다.

2.3.2 조명 처리와 셰이딩(Lighting and Shading)
현실감을 높이기 위해서 광원이나 텍스쳐 셰이딩 모드를 설정 할수 있다.
광원을 실세계와 같이 표현하기에는 아직 너무 많은 비용이 사용되므로 광자(photon)와 표면간에 일어나는 현상을 근사적으로 표현하고 있다.
셰이딩 모드도 마찬가지로 픽셀당 정교하게 계산을 하지 못하고 정점 단위의 셰이딩인 Gouraud셰이딩이 주로 쓰인다.

2.3.3. 투영(Projection)
시야 영역을 양끝 모서리점이 (-1, -1, -1)과 (1, 1, 1)의 좌표를 가지는 단위 정육면체로 변환하는 것이다. 이런 단위 정육면체를 정규 시야 영역(canonical view volume)라고 한다. 대표적인 투영 방법은 직교 투영(Orthographic projection)과 원근 투영(perspective projection) 이 있다.

2.3.4 클리핑(Clipping)
전체 또는 일부가 시야 영역에 포함되는 기하 요소만이 레스터화 단계로 전달되어야 한다. 투영을 통하여 생성된 단위 정육면체에 포함되는 모델만 다음 파이프라인으로 전달된다.

2.3.5 화면 매핑(Screen Mapping)
윈도우 내부의 크기로 변환이 되어 각 기하 요소의 화면상의 좌표를 찾아낸다.

2.4 레스터화 단계(The Rasterizer Stage)

변환되고 투영된 정점과 색상 그리고 텍스쳐 좌표가 주어졌을 때 (기하 단계에서 제공된다.) 레스터화 단계에서는 각 픽셀에 정확한 색상을 지정하는것이다.

이 단계에서 가시성을 결정하게 되는데 카메라의 관점에서 보이는 기하 요소들의 색상들만 포함해야 한다.
대부분의 그래픽 하드웨어는 Z-버퍼 알고리즘을 사용하는데 Z-버퍼는 색상 버퍼와 동일한 크기와 모양을 가지며, 각 픽셀들은 카메라로부터 가장 가까이 있는 기하 요소까지의 깊이값을 저장해야 한다. 하나의 기하요소가 현재 픽셀로 렌더링될 때 그 기하 요소까지의 깊이를 Z-버퍼와 비교하여 더 가까울 경우 색상과, Z-버퍼에 값을 변경시킨다. 알고리즘은 O(n)의 복잡도를 가진다. 만약 반투명 요소가 있을 경우 불투명한 요소를 먼저 렌더링 한 후에 불투명한 것들을 뒤로부터 앞으로 가는(back-to-front) 순서로 렌더링 해야 한다. 자세한 내용은 15.1절을 참조

텍스처 처리는 5장에 다룬다. 일반적으로 2차원 이미지가 사용된다.

알파 채널(alpha channel)은 색상버퍼와 관련이 있는 것으로, 각 픽셀에 대응하는 불투명도 값을 저장한다. 4.5절
스텐실 버퍼(stencil buffer)는 OpenGL의 한 요소로 한 픽셀당 한 비트에서 8비트까지의 정보를 표현한다. 예를 들면 스텐실 버퍼에 원이 채워져 있을경우 이후에 나오는 모든 기하 요소들을 색상 버퍼에 렌더링할 때 원이 있는 부분만 그려지도록 조절할 수 있다.
프레임 버퍼(frame buffer)은 보통 한 시스템에서 사용되는 모든 버퍼를 총칭하는 말이지만, 종종 색상버퍼와 Z-버퍼만 묶어서 프레임 버퍼라고 하기도 한다.
누적 버퍼(accumulation buffer)는 프레임 버퍼의 또 다른 형태인데 움직이는 물체의 이미지를 누적 평균하여 모션 블러(motion blur)효과를 만들어 낼수도 있다. 또한 초점 신도(depth of field), 안티앨리어싱, 부드러운 그림자(soft shadow)등과 같은 효과에도 쓰인다.

2.5 파이프라인에 대한 정리

지금 하고 있는 내용이 정리이므로 생략-_-

제3장 변환

표기법 이름 특성
T(t) 평행 이동 행렬 한 점을 이동시킨다. 어파인(Affine) 행렬이다.
Rx(ρ) 회전 행렬 x축 주위로 ρ라디안만큼 회전 시킨다. y나 x축에 대한 표기도 이와 유사하다. 직교 행렬인 동시에 어파인 행렬이다.
R 회전 행렬 임의의 회전 행렬. 직교 행렬인 동시에 어파인 행렬이다.
S(s) 크기 행렬 x, y, z축을 방향으로 S배만큼 크기 변환한다. 어파인 행렬이다.
Hij(s) 쉬어 행렬 j성분에 대하여 i성분을 s의 비율로 쉬어(shear) 변환 한다. i,j ∈ {x, y, z}이고 어파인 행렬이다.
E(h, p, r) 오일러 변환 주어진 오일러각(끄덕각(head), 갸웃각(pitch), 도리각(roll))에 따른 방향 지정 행렬, 직교 행렬인 동시에 어파인 행렬이다.
PΟ(s) 직교 투영 평면 또는 볼륨으로 평행 투영한다. 어파인 행렬이다.
PΡ(s) 원근 투영 평면 또는 볼륨으로 원근 투영한다.
slerp(q^, r^, t) slerp변환 사원수 q^, r^과 매개변수 t에 대하여 보간된 사원수를 생성한다.

3.1 기본 변환(Basic Transforms)

평행 이동, 회전, 크기, 쉬어 변환과 같은 기본 변환과 변환의 결합(concatenation), 강체 변환(rigid-body transformation), 법선 벡터 변환(normal transformation), 그리고 역변환 계산을 다룬다.

어파인 행렬의 주된 특징은 변환후 선분의 길이나 각도는 변할수 있어도, 그 선분들간의 평행성은 보존된다.

3.1.1 평행 이동(Translation)
평행 이동 행렬의 역행렬은 T^-1(t) = T(-t)이다.

3.1.2 회전(Rotation)
임의의 축 주위로 ∮라디안만큼 회전시키는 모든 3x3 행렬 R에서 대각 원소들의 합은 축과 무관하게 상수값을 지닌다.
tr(R) = 1 + cos∮로 정의할 수 있다.

회전 행렬은 직교 행렬이다. 그러므로 역행렬은 R^-1 = R^T이다.
또, 회전 행렬의 역변환을 시키는 방법은 하나의 축을 기준으로 Ri^-1(∮) = Ri(-∮) 을 사용하는 것이다.
만일 특정점 p를 회전 중심으로 하여 z축 따라 ∮라디안만큼 회전시키고자 한다면 먼저 T(-p)를 이용하여 z축의 중심으로 이동 후 회전을 한다.
마찬가지로 역변환은 다시 z축 중심으로 이동후 -∮라디안만큼 회전시켜 주면된다.

3.1.3 크기 조정(Scaling)
Sx = Sy = Sz 이면 크기 조정 연산은 균등(uniform)하다고 하고, 그렇지 않을 경우 비균등(nonuniform or isotropic, anisotropic)이라는 용어를 사용한다.
역변환은 S^-1(s) = S(1/Sx, 1/Sy, 1/Sz)이다.

동차화를 위해 행렬의 우측 아래인 (3,3) 원소의 값을 1로 만들어 줄 필요가 있다.

Sx, Sy, Sz중 하나 또는 세개의 음수값을 가지면 거울 행렬(mirror matrix)라고 불리는 반사 행렬(reflection matrix)이다. 두개의 값이 -1이면 ∮라디안만큼 회전한 효과가 발생한다.
반사 행렬이 검출되면 특별하게 다루어야 하는데 컬링(culling)이나 조명 효과에 문제가 생길수도 있다.

3.1.4 쉬어(Shear) 변환
그림

x는 0번 행을 나타내고 z는 3번 열을 나타낸다.
x값에다가 z와 s값의 곱을 합한 것이 된다. 이로 인해 x축 방향으로 기울어 진다.

임의의 쉬어 행렬의 판별자는 |H| = 1 이므로 쉬어 행렬은 체적 보존(volume preserving) 변환임을 유의해야 한다.

3.1.5 변환의 결합(Concatenation of Transforms)
행렬의 결합은 교환 법칙이 성립되지 않는다. 책에서는 결합시 오른쪽부터 이루어 진다.
즉, TRS(p) = T(R(S(p))) 임을 의미한다.

3.1.6 강체 변환(The Rigid-Body Transform)
물체를 이동하거나 회전 시킬때, 물체의 모양은 영향을 받지 않을 경우 강체 변환이라고 한다.
강체 변환의 특징은 물체의 길이와 각도는 보존된다는 것이다.

임의의 강체 변환 행렬은 T(t)R의 형태를 가진다.

그림

X의 역행렬은 X^-1 = (T(t)R)^-1 = R^-1T(t)^-1 = R^T T(-t)로 계산된다.

여긴 몰라

3.1.7 법선 벡터 변환(Normal Transform)
변환을 한 후에 삼각형의 외적을 통하여 법선 벡터를 구하는 경우라면 문제가 되지 않으나
법선 벡터를 포함하는 경우라면 법선 벡터의 변환에도 신경을 써야 한다.

벡터이므로 이동의 경우에는 변할것이 없고
회전의 경우에는 똑같이 회전을 하여주면 된다.
만약 크기 조정일 경우에는 균등 크기 조정이라면 크기 조정된 값을 나누어 주면 되지만
비균등 조정일 경우에는 역행렬을 새로 구해 주어야 한다.

비록 완전한 역변환이 필요하다고 하여도 행렬의 좌측 상당 부분의 adjoint의 전치 행렬만 필요하다.
어짜피 정규화를 하기 때문에 판별자를 나눌 필요가 없기 때문이다.

3.1.8 역변환 계산
행렬이 단일 변환이거나 단순 변환일 경우에는 매개변수를 반전시키고 행렬의 적용순서를 바꿈으로 쉽게 계산가능하다.
M = T(t)R(∮)이면 M^-1 = R(-∮)T(-t)가 된다.

행렬이 직교한다면 M^-1 = M^T가 된다.

특별히 알려진게 없다면 adjoint 방법, Cramer의 법칙, LU분해, 가우스 소거법 등을 이용하여 역행렬을 계산할 수 있다.

3.2 특수한 행렬 변환과 연산

3.2.1 Euler 변환
E로 표기되는 Euler변환은 E(h,p,r) = Rx(r)Ry(p)Rz(h) 과 같고 회전 결합이므로 직교 결합이다.
이의 역행렬은 E^-1 = E^T = (RzRxRy
?)^T = Ry^T Rx^T Rz^T 회전만의 결합이므로 전치 행렬을 사용하는게 더 쉽다.

h(도리각, y축 회전), p(끄덕각, x축 회전), r(갸웃각, z축 회전)

Euler변환은 짐볼락(gimbal lock)을 일으킬수도 있다. 이는 회전시에 하나의 회전 자유도를 잃게되는 현상인데
만약 y축으로는 회전 하지 않고 x축으로 π/2 라디안 회전한다. 그리고 z축으로 회전하고자 한다면 실제로 y축으로 회전하는게 된다.

3.2.2 Euler 변환으로부터 매개변수 추출
중간 생략

h = atan2(-f20, f22)
p = arcsin(f21)
r = atan2(-f01, f11)

h, p, r은 유일한 값을 가지지 않을수도 있다는 것은 수치적 불안정(numerical instability)를 야기시킨다.
속도를 희생시킴으로 피해갈 수 있다.

3.2.3 행렬 분해(Matrix Decomposition)
강체 변환에서 평행 이동과 회전 행렬을 얻어내었고
직교 행렬로 부터 Euler각을 얻어내었다.

회전 이동, 크기, 쉬어 변환을 알아내기는 힘들다.
책의 자료를 참조

3.2.4 임의의 축 주위로 회전 이동
r축을 중심으로 α라디안 만큼 회전하고자 한다면
r과 수직인 두축을 찾아낸다. 그리고 표준 기저로 변환후 변환된 r축으로 α라디안 만큼 회전을 한다.
그리고 다시 원래의 기저로 변환을 하면 회전은 성공적으로 이루어 진다.

r이 아닌 다른 s, t축을 만드는법. 다시 채워넣기

변환식 R 그림으로 넣기

3.3 사원수(Quaternions)

사원수는 4개의 성분을 가진다. 그리고 표시할때는 q^로 표시한다.

3.3.1 수학적 배경
q^ = (qv, qw) = iqx + jqy + kqz + qw = qv + qw
qv = iqx + jqy + kqz = (qx, qy, qz)
i^2 = j^2 = k^2 = -1
jk = -kj = i
ki = -ik = j
ij = -ji = k

qw는 사원수 q^의 실수부이다. 허수부는 qv이며 i, j, k는 허수 단위라고 부른다.
허수부 qv에 대하여 더하기, 크기, 내적, 외적등 모든 법선 벡터 연산을 사용할 수 있다.

두 사원수 q^ 와 r^의 곱셈 연산을 다음과 같이 유도할 수 있다. 허수간의 곱셈은 비가환적이다.
q^ r^ = (iqx + jqy + kqz + qw)(irx + jry + krz + rw)

    = i(qy rz - qz ry + rw qx + qw rx) + j(qz rx - qx rz + rw qy + qw ry) + k(qx ry - qy rx + rw qz + qw rz) + qw rw - qx rx - qy ry - qz rz
    = (qv rv + rw qv + qw rv, qw rw - qv·rv)
다음은 덧셈, 공액(conjugate), 놈(norm), 항등 사원수에 대한 정의이다.
덧셈 q^ + r^ = (qv, qw) + (rv, rw) = (qv + rv, qw + rw)
공액 q^ ^* = (qv qw)^* = (-qv, qw)
n(q^) = q^ q^ ^* = q^ ^* q^ = qv·qv + qw^2 = qx^2 + qy^2 + qz^2 + qw^2
항등 사원수 i^ = (0, 1)

놈의 정의로 부터 역을 구할수 있다.
n(q^) = q^ q^ ^*
q^ q^ ^* / n(q^) = 1
역 : q^ ^-1 = ( 1 / n(q^) )* q^ ^*
놈의 또 다른 표현은 n(q^) = ㅣㅣq^ㅣㅣ

스칼라 곱셈은 가환적이다.

정의로부터 유도된 규칙이다.

공액 규칙 (q^ ^*)^* = q^
(q^ + r^)^* = q^ ^* + r^ ^*
(q^ r^)^* = r^ ^* q^ ^*
놈 규칙 n(q^ ^*) = n(q^)
n(q^ r^) = n(q^) n(r^)
곰셈 법칙
선형성 p^(sq^ + tr^) = sp^ q^ + tp^ r^
(sp^ + tq^)r^ = sp^ r^ + tq^ r^
결합 법칙 p^(q^ r^) = (p^ q^)r^

단위 사원수 q^ = (qv, qw)는 n(q^) = 1인것을 말한다.
이로부터 유도를 하면 다음과 같이 된다.
q^ = (sin∮uq, cos∮) = sin∮uq + cos∮
n(q^) = n(sin∮uq, cos∮) = sin^2∮(uq·uq) + cos^2∮ = sin^2∮ + cos^2∮ = 1

복소수에 대해 2차원 단위 벡터는 cos∮ + i*sin∮ = e^i∮과 같이 쓸 수 있다.
사원수에서는 q^ = sin∮uq + cos∮ = e^∮uq

단위 사원수에 대한 로그와 멱함수(power function)는 다음과 같다.

로그 log(q^) = log(e^∮uq) = ∮uq
멱수 q^ ^t = (sin∮uq + cos∮)^t = e^∮t*uq = sin(∮t)uq = cos(∮t)

3.3.2 사원수 변환
한 점 또는 벡터 p=(Px, Py, Pz, Pw)^T의 네 좌표를 사원수 p^의 성분들로 집어넣고 q^ = (sin∮uq, cos∮)인 단위 사원수 하나가 있다고 가장하자.
q^ p^ q^ ^-1 은 p^(같은 의미로 점p)를 uq축을 중심으로 2∮만큼 회전시키는 것이 된다. q^는 단위 사원수이기 대문에 q^ ^-1 = q^ ^*가 된는 점을 유의하자.
행렬 변환

일부 시스템에서는 행렬 연산이 하드웨어적으로 구현되어 있다.

구선형 보간(Spherical Linear Interpolation)

한 벡터에서 다른 벡터로의 회전

3.4 정점 혼합(Vertex Blending)

스키닝(skinning), 엔빌로핑(enveloping), 골격-부분 공간 변형(skeleton-subspace deformation)등과 같은 여러 가지 이름을 가지고 있다.

캐릭터의 팔 애니메이션에서 상박과 하박의 강체 연결부위에 피부를 입힌다. 이 피부는 하박이나 상박행렬의 변환의 영향을 받아 변환되는데 이러한 기본 기법을 스티칭(stitching)이라고 한다.

u(t)는 위치가 시간 t에 다라 정해지는 변환된 정점
p는 원래 정점
Mi는 원래 뼈의 좌표계로부터 월드 좌표계로 변환
Bi(t)는 시간이 지남에 따라 애니메이션이 되는 i번째 뼈의 월드공간

Bi(t)와 Mi^-1은 하나로 결합 되며, 애니메이션의 각 프레임에서 각각의 뼈마다 하나씩 만들어 진다.
이 결합 행렬이 정점 p에 적용되어 변환하고, 여기에 가중치 Wi를 곱한후 합산한다. 이게 바로 정점 혼합

3.5 투영(Projection)

한 장면을 렌더링하기 전에, 그 장면에 있는 모든 물체들은 평면이나 단순한 볼륨상에 투영되어야 한다. 그런후 클리핑과 렌더링이 수행된다.

이하 설명은 오른손 좌표계를 사용한다. (DirectX는 왼손 좌표계를 사용, OpenGL은 오른손 좌표계)

3.5.1. 직교 투영
가장 단순한 직교 투영은 의 형태로 near, far 평면의 구별없이 z축으로 투영시킨다.
판별자 |Po| = 0 이므로 Po는 비가역적이다. 다시 말하면, 이 변환은 3차원을 2차원으로 축소하면서 다시 복원할 방법이 없는것이다.

이보다 좀더 일반적인 행렬은 (left, right, bottom, top, near, far) 6개의 요소로 표현된다.
이 6개의 평면으로 형성된 AABB(축에 정렬된 경계상자(Axis Aligned Bounding Box))를 크기 조정 벼환하고 평행 이동하여 중심이 원점에 있는 축과 정렬된 정육면체를 만들어준다.

Po는 평행 이동과 크기 행렬을 결합한 것이다.
위의 투영후 (-1, -1, -1)의 최소 모서리와 (1, 1, 1)의 최대 모서리를 가지는 축에 정렬된 정육면체가 만들어진다.

DirectX와 같은 왼손 좌표계에서는 z축 방향이 반대이고 z의 깊이가 -1, 1?구간이 아니라 0, 1?구간 이므로
과 같은 행렬이 만들어 진다.

3.5.2 원근 투영
카메라(시점)은 원점에 있고, 하나의 점 p를 z = -d, d > 0인 평면에 투영하여 새로운 점 q = (qx, qy, -d)를 얻어내고자 한다.

q의 다른 성분들은 같은 방법으로 구할 수 있다. qy = -p (py / pz) 와 qz = -d이다.

이 수식을 행렬로 나타내면

점 q를 대입하여 검증 가능하다.

직관적으로 볼 때 왜 동차 좌표가 투영에 적합한지를 이해하는 것은 어렵지 않다.
쉽게 기하학적으로 설명하기 위해서는 점 (px, py, pz)를 w = 1인 평면에 투영한다고 보는 것이다.

직교 투영이 그랫던 것처럼 원근 투영 변환에서도 실제로 평면상에 투영하는 것이 아니라 시각 절두체를 이전에 설명한 정규 시야 영역으로 변환한다.

시야는 장면을 현실감을 느낄 수 있도록 하는 중요한 요소이다.
인간의 시야와 컴퓨터면과 비교할 때 관계는 다음과 같다.
∮ = 2 arctan( w / 2d )
∮는 시야, w는 시선에 수직인 물체의 폭, d는 물체까지의 거리

시각 절두체를 단위 정육면체로 변환하는 원근 투영 변환 행렬이다.

DirectX와 같이 근평면을 z = -1 대신에 z = 0으로, 원평면을 z = 1로 매핑하고 z축의 방향을 반대로 바꿔어 주면 다음과 같은 행렬식으로 표현된다.

제4장 시각적 외양(Visual Appearance)

4.1 광원(Light Source)

방향 광원(directional light), 점 광원(point light), 집중 조명 광원(spot light)

점 광원과 집중 조명 광원은 위치가 정해진 광원(positional light)이다.

4.2 물질(Material)

실시간 시스템의 물질은 주변광 성분, 난반사 성분, 정반사 성분, 광택도(shininess), 방사성(emissive)등의 이름을 가지는 다수의 재질 매개변수들이 있다.

4.3 조명 처리(Lighting)와 셰이딩(Shading)

조명처리(Lighting)는 물체와 광원간의 상호작용 그리고 이들과 렌더링될 객체의 기하 구조와의 상호작용을 나타내는 용어이다.
셰이딩(Shading)는 조명 효과를 계산하고 그로부터 각 픽셀의 색상을 결정하는 과정이다.

셰이딩은 단순(flat)셰이딩, Gouraud 셰이딩, Phong 셰이딩의 3가지 유형이 있다.

단순 셰이딩의 색상값은 개별 삼각형에 대해서 계산되고,
Gouraud 셰이딩은 삼각형의 각 정점에서 조명값이 정해지고 계산된 색상이 삼각형 전체로 보간된다.
Phong 셰이딩은 각 정점에 저장된 셰이딩용 법선 벡터를 보간하여 계산한다.

Gouraud 셰이딩은 단순 셰이딩과 마찬가지로 정점에서만 조명효과를 계산하기 때문에 단순 셰이딩만큼 빠르다.
하지만 정확한 집중 조명 광원의 효과를 나타 내지 못하고 마하밴드(Mach band) 효과가 발생한다.

Pixar사의 RenderMan? 시스템은 Phong 셰이딩 시스템과 같이 작동하도록 표면을 작은 삼각형으로 분할하고, 분할된 것들을 각각 렌더링 하여 조합하기 때문에
위의 문제를 상당부분 해결한다.

4.3.1 난반사 성분(Diffuse Component)
난반사 조명은 광원 벡터와 물질의 표면 법선 벡터와의 cos값에 의해 결정한다.

i_diff = n ·l = cos∮
n과 l은 정규화된 벡터이다. 각도 ∮>π/2인경우 난반사 조명값은 0이다.

난반사는 카메라의 위치와는 독립적(view-independent)이며, 빛이 비치는 면은 어느 각도에서 봐도 동일하다.

i_diff = (n · l)m_diffⓧs_diff
m_diff는 물질의 색상
s_diff는 광원의 난반사 색상

0<∮<π/2의 범위 이므로
i_diff = max((n · l), 0) m_diffⓧs_diff

4.3.2 정반사 성분(Specular Component)
정반사는 난반사와 달리 시점에 의존적(view-dependent)이다.

v는 관측자를 향하는 벡터,
r은 법선 벡터 n을 기준으로 광원 벡터 l의 반사 벡터이다.
r = 2(n · l)n - l

i_spec = (r · v)^m_shi = (cos ρ)^m_shi
이것을 Phong 조명 처리식이라고 부른다.(phong 셰이딩과는 다르다.)

blinn에 의해 제안된 근사식이다.
i_spec = (n · h)^m_shi = (cos θ)^m_shi
h는 l과 v사이의 정규화된 반 벡터이다.
h = (l + v)/(||l + v||)

광택도(shineness)는 시점 벡터와 광원 벡터의 물체에 대한 내적의 제곱으로 구해진다.
광택도가 커질수록 하이라이트의 응집도는 높아진다.

Schick의 근사식이다. 식이 단순하여 상당히 빠르다.
t = cos ρ
i_spec = (t / (m_shi - tm_shi + t) ) m_specⓧs_spec

4.3.3 주변광 성분(Ambient Component)
우리가 사용하는 단순 조명 처리에서는 광원으로부터 빛이 나와 표면상에 직접적으로 비춰질 뿐, 간접 조명은 고려 되지 않는다.

i_amb = m_ambⓧs_amb
단순한 상수값으로 최소한의 색상으로 표현된다.

4.3.4 조명 처리식(Lighting Equation)
지역 조명 모델(local lighting model)의 경우 광원으로 부터 나온 빛의 경우에만 영향을 받는다.
i_tot = i_amb + i_diff + i_spec

실세계에서 빛의 강도는 광원으로부터 거리의 제곱에 반비례한다.

p는 셰이딩 될 점
S_pos는 광원의 위치
s_c은 정적 감쇠 효과를 조절하는 항
s_l은 선형(1차) 감쇠
s_q는 이차 감쇠

물리학적으로 올바른 거리를 표현 하려면 s_c = s_l = 0, s_q = 1로 설정한다.

다시 지역 광원 모델에 감쇠를 포함하여 표현하면
i_tot = i_amb + d(i_diff + i_spec)

집중 조명광에 속할때도 고려 해야 한다.
c_spot = max(-l * s_dir, 0)^s_exp
l은 광원 벡터
s_dir은 집중 조명 광선의 방향
s_exp는 집중 조명광의 중심으로부터의 감쇠(fall-off)를 조절하는 누승(exponentation)인자이다.
만약 집중 조명광이 아니면 c_spot = 1 이 되어야 한다.

최종 조명 처리식은 다음과 같다.
i_tot = c_spot(i_amb + d(i_diff + i_spec))

특별히 영향을 주는 조명이 없다 하더라도 원색(solid color)를 부여하는게 필요하다.
m_emi는 물질의 방사 매개변수를 표현한다.

물질이 자체의 색사을 가지듯이 고정 배경 조명을 근사하는 전역 주변 광원 매개변수 a_glob를 가진다.

이렇게 m_emi와 a_glob를 포함하는 최종식이다.
i_tot = a_globⓧm_amb + m_emi + c_spot(i_amb + d(i_diff + i_spec))

최종 계산된 색상의 값이 1이 넘어갈 경우 값 고정과 스케일링(clamping and scaling)이 필요하다. 만약 RGB값중 최종 계산된 R값이 2라면 R, G, B 모든 성분에 2를 나누어 스케일링 해야 한다.

4.4 앨리어싱과 안티앨리어싱(Aliasing and Antialiasing)

다각형을 픽셀로 표현하고자 할때 픽셀의 크기 때문에 계단 현상(애니메이션에서는 crawlies현상)이 발생한다.
이것을 좀더 정확하게 말하면 앨리어싱 이라고 부른다.

4.4.1 샘플링과 필터링 이론
이미지를 렌더링하는 과정은 원래 샘플링 작업이다.
3차원 이미지로 텍스처를 렌더링하기 위해서는 텍셀(texel)들을 재샘플링(resample)해야 한다.

일정한 시간 간격에 바퀴가 돌때 이것을 낮은 비율로 샘플링 하면 반대로 돌아가듯이 볼수 있다.
이것을 시간적 앨리어싱(temporal aliasing)이라고 부른다.

신호를 적절하게 샘플링하려면 샘플링 주파수는 샘플링될 신호의 최대 주파수보다 두 배 이상 되어야 한다.
이것을 샘플링 이론이라고 하며, 이러한 샘플링 주파수를 Nyquist주파수 또는 Nyquist한계라고 한다.
신호의 주파수는 제한(bandlimited)되어야 한다. 이것의 의미는 최대 주파수의 값을 알아야 한다는 의미이다.

복원(Reconstruction)

주로 복원에 사용되는 세 가지 필터는 박스 필터, 텐트 필터, 고주파 차단 필터(lowpass filter)가 있다.

박스 필터(최근접 이웃 필터 : nearest neghbor)는 가장 단순하며 매우 불연속적인 계단 모양으로 나오기 때문에 성능은 나쁘다.
텐트 필터(삼각 필터)는 주어진 위치의 이웃한 샘플 점들 사이의 선형 보간한다. 신호가 부드럽지는 않지만 연속적이므로 박스 필터보다는 좋다.
고주파 차단 필터의 신호 성분은 사인파이다. sin(2πf). 여기서 f는 그 성분의 주파수이고 샘플간의 간격은 1/f이다.

이상적인 고주파 차단 필터는 sinc 필터를 사용한다. Why??????????????????????????????????

sinc(x) = sin(πf) / πx

[WWW]Fourier Analysis

재샘플링(Resampling)

샘플링된 신호가 1만큼의 단위 간격을 가진다고 할때,
새롭게 샘플된 a가 a > 1 이면 축소(downsampling : 하향 샘플링)가 일어나고, a < 1 이면 확대(upsampling : 상향 샘플링)가 일어난다.

확대의 경우 간단하다. 샘플링된 신호를 원하는 간격으로 재샘플링하기만 하면 된다.
축소의 경우는 조금 복잡하다. 축소를 하면서 생기는 앨리어싱을 피할 수 있는 샘플링 주파수는 정할 수 없다. 샘플링된 신호로 부터 연속된 신호를 만들어 내기 위해 sin c(ax)를 사용하는 필터가 사용되어야 한다. 그리고 나면 원하는 간격으로 재샘플링이 가능하다.
sin c(ax)를 필터로 고주파 차단 필터의 너비를 크게 하여 신호에서 더 많은 고주파 성분을 제거하는 것이다. 디지털 이미지의 처리와 관련지어 말한다면, 고주파를 없애므로 이미지를 흐리게(blur)하고 낮은 해상도로 재샘플링하는 것이다.

4.4.2 화면 기반 안티앨리어싱
여기에 나오는 알고리즘은 화면 기반이다.
파이프라인의 출력 샘플들만 가지고 동작을 하므로 렌더링될 객체에 대한 지식이 필요 없다.

화면 기반 안티 앨리어싱 기법의 일반적인 전략은 화면에 대한 샘플링 패턴을 사용하는 것과 가중치를 주어 합산하는 것이다.

n은 한 픽셀에서 취해진 샘플들의 개수
w는 가중치
c는 샘플의 색상

픽셀당 한 개 이상의 샘플을 추출하는 모든 안티앨리어싱 알고리즘을 수퍼샘플링(supersampling)방법 이라고 한다.

가장 단순한 전화면 안티앨리어싱(FSAA : Full-Scene Antialiasing)은 더 높은 해상도로 장면을 렌더링한 후 이웃된 샘플들을 평균하여 이미지를 만들어 낸다.
조금 다르게, 한 화면축을 따라서 두번씩 샘플링 하는 방법이 있는데, 1x2 또는 2x1 수퍼샘플링이라고 부른다.

누적 버퍼(accumulation buffer)를 사용할 경우 동일한 해상도를 가지는 버퍼를 만들어 한장면에 대하여 x, y축으로 조금씩 이동시켜서 합산한다.
누적 버퍼는 모션 블러(motion blur)이나 초점 심도(depth of field)등의 효과를 위해서 사용될 수 있다.

T-버퍼는 누적 버퍼의 변종이다. 이것은 2개이상의 이미지들와 Z-버퍼로 구성된다. 렌더링시 삼각형을 어디로 보내질지 결정하는 마스크가 있다.
이 마스크를 원하는 위치나 관측 조건에 따라 변경하여 삼각형을 그려서 파이프 라인의 끝에서 합산한다.
T-버퍼로 안티앨리어싱을 사용한다면, 버퍼마다 x, y 오프셋을 개별적으로 설정하여 버퍼마다 병렬적으로 삼각형을 보낸다.
그리고 나서 합산을 하여 단일 패스에 안티앨리어싱을 처리할 수 있다.

이렇게 누적 버퍼, T-버퍼는 FASS에 비해 가지는 장점은 샘플링 패턴을 변경할 수 있다.

픽셀당 샘플링 해상도(sampling rate)를 증가시키는 다른 알고리즘으로 Carpenter가 제안한 A-버퍼가 있다.
다중샘플링(multisampling)이라고도 부르는데 각 격자 셀에서 다각형이 점유하는 개략적인 면적을 계산한다.
이처럼 다중 샘플링 알고리즘은 일반적으로 단일 패스에서 픽셀당 한 개 이상의 샘플을 취한다. 그리고 하나의 격자 셀에서의 샘플들에 대한 계산을 공유한다.
하드웨어 A-버퍼의 경우, 하나의 격자 셀에 대하여 표면당 한번의 조명값을 계산후, 그 표면에 모든 샘플들은 계산된 값을 공유한다.
이처럼 계산 비용을 절감할 수 있으나 기본적으로 텍스처나 그림자의 안티앨리어싱이 수핼할 수 없다는 것을 의미한다.
A-버퍼에서 렌더링될 각 다각형은 자신이 전체적으로 또는 부분적으로 점유하고 있는 화면 격자 셀에 대하여 적용 범위 마스크(coverage mask), 음영값, 깊이값(최대, 최소나 기울기를 유지함으로 정확한 깊이 값을 알아내어 교차하는 다각형들도 적잘하게 렌더링 할 수 있다.)등의 정보를 하나의 단편(fragment)로 생성한다.
적용 범위 마스크는 하나의 단편속에 임의 개수의 다각형들의 깊이를 계산할 수 있고 논리합으로 결합하여 픽셀단위의 퍼센티지를 구하여 적절한 색상을 표현 할 수 있다.
단점은 수직, 수평 에지일 경우 2차원 샘플링 패턴을 1차원으로 바꾸기 때문에 결과적으로 해상도가 떨어진다.
그리고 도하나의 단점은 샘플들을 결합할때 박스 필터를 사용한다는 점이다. 다시 말하면 한 셀에서의 샘플들은 다른 이웃한 픽셀들의 색상에는 영향을 미치지 않는 의미이다.

NVIDIA의 Quincunx방법은 고해상도 안티앨리어싱(High Resolution Antialiasing : HRAA)라고도 부른다.
주사위의 숫자 5의 형태의 샘플을 취하는데 가중치를 두어 중심은 1/2 가장자리의 4개는 1/8씩 가중치를 두어 합산한다.
이 패턴은 2차원 텐트 필터를 근사한 것으로 박스필터보다 성능이 좋다.

통계적 샘플링(stochastic sampling)은 픽셀별로 다른 샘플링 패턴을 사용한다. 이런 임의성은 반복적인 앨리어싱의 효과를 잡음으로 바꿔주기 때문에 둔감한 인간의 시각 시스템은 앨리어싱을 눈치 채지 못하므로 결국 시각적으로 더 좋게 보인다.

가장 공통적인 통계적 샘플링으로 지터링(jittering)이 있다.
이것은 층상 샘플링(stratified sampling)의 한 가지 형태로 픽셀당 n개의 샘플이 사용될 때, 각 샘플은 이 중 한 영역에 임의의 위치에 놓인다.
최종 픽셀은 샘플들의 평균값으로 구해진다.
N-rooks 샘플링은 또 다른 형태의 층상 샘플링이다.
nxn 격자상에 놓이게 되며, 한 행과 열당 하나의 샘플을 이용한다.

3D labs에서 개발한 SuperScene? 하드웨어 안티앨리어싱 기법은 픽셀별로 불규칙하게 흩어진 샘플 패턴을 사용한다.
AT&T사의 Pixel Machine과 Silicon Graphics사의 VGX 그리고 최근에 나온 것으로 ATI의 SMOOTHVISION 기법에서는 비월 샘플링(interleaved sampling)이라고 불리는 기법을 사용한다. 서로 다른 사용자 정의 샘플링 패턴을 허용 함으로써 반복되는 패턴 내에서 섞어서 쓸 수 있다.

안티앨리어싱하기 위한 매우 다양한 방법들이 있는데, 이들은 속도, 화질, 생산 비용면에서 서로 상충관계가 있다. 완벽한 해결 방법은 없으며, 앞으로도 없을것이다.
하지만 Quincunx 알고리즘과 같이 하드웨어 지원을 받는 방법들은 상대적인 추기 비용으로 합리적인 해결 방안을 제공해준다. 지터링된 다중 샘플링은 패턴의 반복을 막음으로 좀더 좋은 화질의 이미지를 만들수 있다. 그래픽 가속기는 시간이 지남에 따라 더 좋은 샘플링과 필터링 기법들을 제공할 것이다.

4.5 투명성(Transparency), 알파값(Alpha), 합성(Composition)

실시간 렌더링 시스템에서 투명 효과는 상대적으로 단순하고 제한적이다.
일반적으로 사용할 수 없는 효과들 중에는 빛의 굴절, 투명한 물체의 두께에 따른 빛의 감쇠, 시야 각도에 따른 반사도나 투과도의 변화등이 포함된다.

가장 간단한 형태의 투명 효과는 screen-door 투명성이다. 서양 장기판 모양의 격자 채움 패턴을 가지는 다각형으로 50%의 투과도를 가진다.

보통은 알파 혼합(alpha blending)이라는 개념을 사용한다. RGB색상외에 알파(α)의 요소가 추가로 필요하다.
이런 RGB 원래 픽셀 색상과 혼합하는 것을 over연산자를 이용해서 표현한다.
Cο = αs Cs + (1 - αs)Cd (<= over operator)
Cs는 투명한 물체 (source), αs는 물체의 투명도 값, Cd는 혼합되기전의 픽셀(destination), Cο는 over연산을 사용하여 최종 출력값이다.

대부분 투명 효과를 사용하기 위해서는 정렬하는것이 최선이다.

p.132 ~ p133

알파 요소는 에지를 안티앨리어싱할 때도 사용된다. 픽셀당 점, 선분, 에지등의 점유율을 알파 요소로 두고 over연산을 통해 근사값을 얻어내는 방식이다.

미리 곱해진 알파(premultied alpha) = 연관된 알파(associated alpha)는
Cο = C^'s + (1 - αs)Cd 에서 C^'s이다.
위에서 미리 곱해진 알파로 연산된 RGB값은 α값을 넘지 않는다.
이렇게 구해진 값을 합성함으로 최종 값을 구하는게 속도면에서 유리하다.

Chroma-keying = blue-screen matting : 투명색 지정

4.6 안개(Fog)

실시간 컴퓨터 그래픽 시스템에서 가장 간단하게 구할수 있는 기상 요소이다.
안개는 야외장면의 현실감이나 원근감을 높여 주고 poping 현상을 부드럽게 처리할 수 있다.

Cp = fCs +(1 - f) Cf
Cf는 안개 색상, f는 안개 인자(fog factor, 0 ~ 1 구간의 값을 가진다.), Cs는 면의 색상, Cp는 최종 색상

선형 안개(Linear fog)는 관측자와의 거리에 따라 선형적으로 감소하는 안개 인자를 가진다.
f를 생성할때 f = (Zend - Zp)/(Zend-Zstart)로 쉽게 구할 수 있다.

지수 함수적으로 짙어지는 두가지 종류의 안개가 있다.
지수형 안개(exponential fog)의 안개 인자 f = e^(-df Zp)
자승 지수형 안개(squared exponential fog)의 안개 인자 f = e^(-df Zp)^2
df는 안개의 밀도를 제어하는데 사용되는 매개 변수이다.

위의 안개 그래프 포함

몇몇 그래픽스 하드웨어와 소프트웨어는 시점 관련 깊이(eye relative depth)를 지원한다. 이것은 원근 투영 변환의 효과를 원상복구시킴으로써 깊이값이 선형적으로 변하도록 한다. 시점에 따라 깊이는 비선형적으로 변하기 때문에 관측자로부터 물체까지의 실제 거리를 이용하는 것이 더 정확하다. 이것을 방사형 안개(radical fog), 영역 기반 안개 또는 유클리드 거리 안개라고 한다.

그외 안개 효과로 텍스쳐 맵핑을 통한 안개효과나 반투명한 빌보드 이미지를 겹쳐서 안개효과를 내는등 여러가지 방법이 있다.

이와 같은 불륨 포그(volumetric fog)기법의 기본 아이디어는 물체와 관측자 사이에 얼마만큼의 공간이 있는지를 계산하고, 그만큼의 공간을 물체 색상에서 안개 색상으로 바꿔주는 것이다.

4.7 감마 보정(Gamma Correction)

픽셀의 값이 계산되어 모니터에 출력할때, 음극선관(CRT : Cathode-Ray Tube)의 전자총에 인가되는 입력 전압과 화면에 나오는 빛의 밝기 사이에는 물리적인 관계가 있다.

I = a(V + ε)^γ
V는 입력 전압, a과 γ(감마)는 모니터 별로 정해진 상수값, ε는 모니터에 설정된 밝기(brightness), I는 출력 빛의 강도이다.
보통 CRT의 감마 값은 2.5정도의 범위이다.

CRT의 반응 곡선은 사람 눈의 빛에 대한 민감성 곡선의 역이라는 사실이 밝혀졌다.
이를 기반으로 CRT가 화상을 표시하기 위한 최적의 휘도값을 결정할 수 있게 되었다.

계산된 값이 0.5이면 1.0의 절반의 밝기라고 예상되어 진다.
하지만 사람의 눈에는 CRT전자총의 인가 전압과 빛이 강도는 선형적이지 않으므로 감마 보정이 팔요하다.
C = Ci^1/γ
C는 계산된 색상 성분, Ci는 계산될 색상성분, γ는 감마

감마 보정의 필요성

  • 플랫폼간 호환성
  • 색상 재현성, 일관성, 보간
  • 디더링(두가지 색상이 밀접하게 붙어서 하나의 색상으로 보이도록 한다.)
  • 선분과 에지 안티앨리어싱 품질
  • 알파값 혼합과 합성(compositing)
  • 텍스쳐 매핑
감마 보정이 안될때 로핑(ropuing)이라고 불리는 에지가 꼬여 보이는 현상이 일어나기도 한다.

감마 보정은 사용자의 선택 사항이 아니다. 이것은 화상의 재현성과 렌더링 알고리즘의 품질을 높이기 위해 응용 프로그램 설계시에 고려되어야 한다.

제5장 텍스쳐 처리(Texturing)

세밀한 기하구조를 텍스쳐로 표현함으로 모델링, 메모리, 속도면에서 엄청난 절감 효과가 생긴다.

5.1 일반화된 텍스처 처리(Generalized Texturing)

객체 공간의 위치를 계산 (u,v) 를 찾기위해 투영 함수를 사용 텍셀을 찾기 위해 대응자 함수(들)을 사용 값 변환 함수 적용 수식이나 단편값을 변경

많이 쓰이는 투영 함수로는 구면 투영, 원통형 투영, 평면 투영, 자유 투영이 있다.
실시간 작업에서, 투영 함수들은 보통 모델링 단계에서 적용된다. 그리고 투영 결과는 정점에 저장된다.

구면 투영은 모든점을 특정한 점을 중심으로 하는 가상의 구 위로 투사한다. 이는 Blinn과 Newell이 제안한 환경 매핑 기법에서 사용된 것과 동일하다.
원통형 투영은 구면 투영과 마찬가지로 u 텍스쳐 좌표를 계산한다. 이때 원통의 중심을 따라 동일한 거리에 있는 v 텍스쳐 좌표를 이용한다. 표면이 회전하는 경우와 같이 자연축(natural)을 가진 물체에 유용하다. 그러나 표면과 수직할때는 왜곡 현상이 발생한다.
평면 투영은 X-ray 슬라이드 영사기와 같다. 한 방향으로 투영하고, 모든 표면에 텍스처를 적용한다. 이것은 직교 투영을 사용한다. 일반적으로 캐릭터에 적용하는데 앞과 뒤에 별개의 텍스쳐를 붙인 인형처럼 모델을 처리한다.
투영 방향으로 기울어져 있는 표면의 경우 심각한 왜곡 현상이 발생할 수 있다. 이런 경우 수작업으로 모델을 거의 평평한 조각들로 분해 하여야 한다.
메시 펼치기(unwrapping), 평면 투영의 거의 최적인(near-optimal) 집합 만들기 등과 같이 왜곡을 최소화하는 도구를 사용하기도 한다.

대응자 함수는 여러 가지 종류가 있을수도 있다.
매개변수 공간값을 텍스처 공간의 위치로 바꾸는 대응자 함수, 텍스처의 행렬변환하는 대응자 함수, 텍스처 범위 이상의 이미지에 적용되는 방식을 제어하는 대응자 함수, 마지막으로 암시적으로 정의도는 대응자 함수인데 텍셀(texel)값을 통하여 다른 해상도를 가진 이미지 텍스처로 바꿀수 있다.

이미지 텍스처외에도 3차원 이미지 데이터를 매핑할수도 있다. 예를 들면 공간을 채우고 있는 물과 같은 형태로 위치마다 색상이 존재할때 이것을 통해 3차원 매핑을 할수도 있다.

2차원 이미지로 3차원 표면을 깔끔하게 덮는 것은 대개의 경우 매우 어렵거나 불가능하다. 원뿔의 경우 꼭지점에는 여러 픽셀이 한번에 모이고 바닥 부분은 곡면 부분의 텍스처와 일치하지 않는다. 텍스쳐 패치(patch)를 만들어 왜곡 현상을 보완하는데 Turk의 저서를 살펴 보란다-_-

3차원 텍스처는 2차원 텍스처 매핑이 가지는 왜곡이나 봉합(seam)문제가 발생하지 않는다. 문제는 용량과 속도인데 가장 일반적으로 구하는 방법은 잡음 함수(noise function)등을 사용하는 것이다. 낮은 해상도의 Perlin 잡음 텍스처를 픽셀 셰이더를 사용하여 실시간으로도 구현하였다.

1차원 텍스처도 나름대로의 효용이 있는데 높이에 따른 색상 지정(저지대는 초록색으로 산봉우리는 눈과 같은 흰색으로 표시하는 방법)이나 반투명 이미지로 텍스처를 입힌 긴 선을 이용하여 비 내리는 것을 렌더링하는 방법이 있다.

일반적으로 정점은 Gouraud 셰이딩을 통해 보간을 하는데 텍스쳐를 사용할 경우에는 왜곡이 발생할 수 있다. 텍스쳐 좌표들은 선형 보간하지 않는 대신 좌표값에 원근 보정(perspective correction)이 적용된다.

조명과 같은 표면의 효과를 나타내기 위해서 결합 함수(combine function)혹은 텍스처 혼합 연산(texture blending operations)이라고 불리는 방법을 통해 구현한다.

대치(replace) 단순히 표면 색상을 텍스처로 대치한다.
전사(decal) 알파 값으로 텍스처를 바탕 색상과 혼합 한다. 말그대 전사(판박이)한다.
변조(modulate) 텍스처 색상과 표면 색상을 곱한다.

5.2 이미지 텍스처 처리(Image Texturiung)

2차원 이미지를 다각형 표면에 붙여서 렌더링 할때 샘플링과 필터링의 내용이다.

5.2.1. 확대(Magnification)
확대시 가장 많이 사용되는 필터링 기법으로는 최근접 이웃법(nearest neighbor)(이것을 구현한 실제 필터를 박스 필터라 한다.)과 쌍선형 보간법(bilinear interpolation)이 있다.

최근접 이웃법은 확대시 각 픽셀의 중심으로부터 가장 가까운 텍셀값을 취한다. 이 효과를 픽셀레이션(pixelation)이라고 한다.
쌍선형 보간법은 각 픽셀에 대해서 네 개의 이웃한 텍셀을 찾은 후 2차원상에서 선형 보간하여 해당 픽셀값을 찾아낸다.

5.2.2 축소(Minification)
축소가 될때 해당 픽셀에 영향을 주는 모든 텍셀을 찾는것은 실시간 렌더링에서는 매우 어렵다.

확대와 마찬가지로 최근접 이웃 화소를 사용하는 방법은 수평선 부근에서 심각한 결함이 발생한다. 더욱이 움직일 때 더욱 심하게 나타난다.
이 현상을 시간적 앨리어싱(temporal aliasing)이라고 한다.

쌍선형 보간 필터를 사용하면 역시 더 좋아지지만 하나의 픽셀이 4개 이상의 텍셀로부터 영향을 받는 경우 필터링은 실패하고 앨리어싱이 발생한다.

이보다 나은 해결법이 있다.
텍스처의 신호 주파수는 화면상에서 공간상에 위치한 텍셀들이 얼마나 가까이 있는가에 따라 달라진다. Nyquist 한계 때문에 텍스처의 신호 주파수는 샘플링 주파수의 반보다 크지 않아야 한다.
검정선과 하얀선이 번갈아 나오는 그림에서 한검정선에서 다음 검정선까지 너비가 2텍셀이 되므로 파장(wavelength)는 1/2이 된다. 화면상 적절하게 이 텍스처를 표시하려면 주파수는 최소한 2*1/2이 되어야 한다. 즉, 최소한 한 픽셀이 대응되어야 한다. 그러므로 이런 앨리어싱을 피할려면 한 픽셀에 한 텍셀이 대응되어야 한다.

위와 같이 목표를 이루기 위해서는 픽셀들의 샘플링 주파수를 증가시키거나 텍셀의 주파수를 감소시켜야 한다. 샘플링 주파수를 증가시키는 것은 제한적이다. 그렇기 때문에 좀 더 다양한 텍스쳐 축소 알고리즘이 필요하다.

밉 매핑(Mipmapping)

가장 많이 쓰이는 알고리즘이다. 밉(Mip)는 "multum in parvo"라고 하여 라틴말로 "작은 공간에 많은 것들이 들어 있는 것"이다.
피라미드형태로 축소되는 이미지를 필터링하여 만들고 거리에 따라 이미지를 선택한다.
필터링은 2x2집합을 평균하는 박스 필터외에 Gaussian, Lanczos, Kaiset등의 필터를 사용한다.

삼선형 보간법(trilinear interpolation)은 d위치에서 상위 레벨 텍스쳐와 하위 레벨 텍스쳐에소 모두 샘플링한다.

d 좌표상에서 사용자가 제어하는 것 중에 하나로서 상세 단계 편향값(Level of detail bias)이 있다.
추가적으로 d값에 증가하거나 감소시켜서 조절할 수 있다. 텍스처 표면이 움직일때 처럼 시간적 앨리어싱 문제를 피하기 위해서 더 높은 편향값을 사용하기도 한다.

밉맵의 문제로 오버 블러링(overblurring)이 있는데 u방향으로 많은 양의 텍셀과 v방향으로 적은 수의 텍셀을 커버하는 픽셀의 관계는 상대적으로 흐릿하게 보일수 있다.

립 매핑(Ripmapping)

밉 맵의 오버 블러링을 해결하기 위하여 피라미드 형태가 아닌 가로, 세로 크기에 따른 밉맵을 두가지씩 더 생성시킨다.

합산 영역 테이블(Summed-Area Table)

픽셀당 위치하는 텍스쳐의 모든 샘플의 합의 평균을 하여 구한다. 만약 대각선으로 본다면 사용되지 않는 값까지 포함되어 버린다.

립 매핑과 합산 영역 테이블은 비등방 필터링(anisotropic filtering)의 한 종류이다.
밉맵은 원래 텍스쳐의 1/3 정도만 추가적으로 필요한 반면 립맵의 하위 텍스처는 원본보다 3배의 메모리 공간이 필요하다. 합산 영역 테이블 또한 16x16 혹은 그 이하의 크기를 가질 경우, 최소한 2배의 기억공간이 요구된다.

제약이 없는 비등방 필터링(Unconstrained Anisotropic filtering)

합산 영역 테이블이 가지는 부가적인 정사각형 영역을 여러개의 사각형 영역으로 커버한다. 긴쪽으로 사용되는 밉맵과는 달리 사각형을 짧은 쪽을 사용하여 d를 결정한다. 사각형을 중심으로 비등방선(line of anisotropy)을 만들어내고 비등방한 정도에 따라 축을 따라 하나 이상의 샘플을 추출한다. 비등방선이 임의의 방향을 가리킬 수 있으므로 립맵과 합산 영역 테이블이 가지고 있는 방향성의 제약을 가지지 않는다.

5.3 텍스처 캐싱(Cashing)과 압축

텍스처는 작게 유지하는게 좋다. 확대시 발생하는 문제를 회피할 수 있을 정도의 크기로만 유지하는 것이 좋다.

타일링(tiling)혹은 모자이킹(mosicing)이라고 부르는 방법은 여러개의(반복되지 않는) 작은 텍스처들을 하나의 커다란 이미지로 결합하여 텍스처들이 빈번하게 교체되는 것을 막아줌으로써 속도를 향상시킨다.

LRU(least recently used) 정책은 텍스처 캐싱 기법에서 일반적으로 사용되는 것으로 텍스처에 언제 사용되었는지를 기록하는 타임스탬프를 부여하여 오래된 타임스탬프를 가진 텍스처가 먼저 제거 된다. 교체 되어 나가는 텍스쳐가 만약 빈번하게 교체가 되는 경우 스레싱(thrashing)이 일어날 수도 있다. 이럴때는 MRU(Most recently used)정책으로 전환하였다가 다시 LRU정책으로 복귀하는게 좋다.

텍스처를 실시간으로 주문 기반(demand-driven) 시스템으로 한다면 매 프레임마다 일정한 속도를 유지하기가 힘들다. 이럴때 미리 가져오기(prefetching)을 하여 해결할수 잇다.

지리 정보 시스템이나 비행 시뮬레이션과 같이 매우 큰 이미지 데이터를 사용하는 경우 분할하여 사용하는게 좋다. 클립맵(clipmap)과 같은 개선된 자료 구조를 제안한다.

메모리와 대역폭에 대한 문제와 캐싱에 관련된 문제들을 직접적으로 해결할 수 있는 방법은 고정 비율 텍스처 압축 방법이다.
텍스처가 메모리를 적게 사용하고, 캐시의 크기를 효과적으로 증대시킬 수 있고 액세스할 때 대역폭을 덜 낭비하게 되므로 압축 텍스처는 매우 효율적이라고 할 수 있다.

S3 사는 S3 텍스처 압축(S3 Texture Compression : S3TC)이라고 불리는 기법을 개발했다. 이것은 DirectX의 표준(DXTC)으로 선택되었다.
고정된 크기를 가지는 압축 이미지를 만들고 각각의 조각들을 개별적으로 부호화(encode)하며, 복호화(decode)하는 것도 간단하다.

DXTC 이미지 압축 기법은 상대적으로 단순하다. 이미지는 타일이라고 부르는 4x4 픽셀 블록들로 나누어진다. 불투명한 이미지(다시 말해, 알파 채널의 값을 갖지 않는 이미지)의 경우, 각각의 16픽셀 블록은 두 개의 색상값과 16개의 2비트 값들로 저장 함으로써 부호화 된다. 두개의 색상은 16비트(빨간색 5비트, 녹색 6비트, 파란색 5비트)로 표현되며, 해당 픽셀 블록의 색상 범위에 대한 경계값이 된다. 이처럼 2개의 색상이 주어지면 부호화와 복호화 하는 과정에서는 이들 사이에서 일정 간격을 유지하는 두 개의 다른 색상을 얻어낸다. 이렇게 하면 선택할 수 있는 색상은 4개가 되고 각 픽셀에 대해서 4개의 색상중 하나를 표시하는 2비트 값들이 저장된다. 이렇게 압축된 이미지는 압축률이 6:1이 된다. 동일한 방법이 1비트 또는 8비트 알파 채널을 가진 이미지에서도 적용될수 있다. 3차원 텍스처에서도 사용된다.
문제는 이렇게 압축을 하면 손실이 발생한다. 하지만 실제 상황에서 압축 기법의 이미지 신뢰도는 그런대로 만족할만 하다. 이렇게 만들게 되면 RGB값이 직선상에 놓이게 되는데 다시 말하면 빨간색, 녹색, 파란색을 한 블록에서 표현할 수 없다는 말이다. 이것은 컬러 분배(color distribution)라고 불리는 기법으로 해결이 가능하다.

5.4 다중 패스 텍스처 렌더링(Multipass Texture Rendering)

컴퓨터 그래픽의 이론에서는 조명 계산식의 모든 인자들은 단번에 그 값이 정해지고, 하나의 샘플 색상이 생성된다. 실제로는 조명 계산식의 여러 부분들은 독립적인 패스에서 별도로 계산되어지고 연이은 패스에서 이전 단계의 실행 결과를 조금씩 바꿔나가게 된다. 이러한 기법을 다중 패스 렌더링이라고 한다.

각 패스는 조명 처리식의 일부를 계산하고, 중간 결과는 프레임 버퍼에 저장한다. 오프스크린(off-screen) 기억 공간을 활용하고 이미지들을 합성하면 아무리 복잡한 조명식이라도 계산 가능하다.

Quake III 엔진의 초기 설계에서는 10개의 다중 패스 렌더링을 사용한다.
(패스 1-4 : 범프맵 누적)
패스 5 : 난반사 조명 효과
패스 6 : (정반사 성분을 포함한) 기본 텍스처
(패스 7 : 정반사 조명 처리)
(패스 8 : 방사 조명 처리)
(패스 9 : 볼륨 효과 / 기상 효과)
(패스 10 : 화면 섬광)
빠른 기계에서는 단일 프레임당 10개의 패스를 수행한다.
적당한 프레임을 유지할 수 없는 기계라면 괄호 안의 패스들은 생략 할 수 있다.

5.5 다중 텍스처 처리

텍스처를 다중으로 결합한다.

파이프라인에 들어가는 하나의 단위로 텍스처를 만들때 텍스처들의 결합을 한후 파이프라인으로 들어간다.

5.6 텍스처 애니메이션(Texture Animation)

텍스처의 이미지가 반드시 정적일 필요는 없다.
예를 들어 비디오의 소스가 프레임 별로 변하는 텍스처로 사용될 수 있다.
텍스처 좌표를 행렬 변환하여 확대/축소, 회전, 쉬어와 같은 선형적인 변환도 가능하다.
일반화된 투영의 하는 것과 같이 와핑(warping)과 모핑(morphing)변환이나 텍스처 혼합 기법을 이용해 천천히 표면이 변하는 효과도 나타낼수 있다.

5.7 텍스처 처리 방법(Texture Methods)

5.7.1 알파 매핑(Alpha Mapping)
알파값이 있는 이미지를 0으로 지정하여 전사(decaling)를 할 수 있다.
이것을 응용하여 십자 나무(cross tree)를 만들 수 있다.

5.7.2 조명 매핑(Light Mapping)
표면의 난반사 성분은 시야에 독립적(view-independent)하다.
그렇기 때문에 난반사 조명 맵(diffuse light maps)와 같이 미리 계산된(precomputed) 텍스처를 바탕 표면에 곱해줌으로 Phong셰이딩한 효과를 얻을수 있다.

조명 매핑은 암영 매핑(dark mapping)이라고도 하는데 이는 원래 이미지와 조명 이미지의 곱은 원래의 명도를 감소시키기 때문이다. DirectX에서는 결과 명도를 2배 또는 4배 증가 시켜주는 텍스처 혼합 연산을 지원한다.

조명 매핑은 낮은 해상도에서도 충분한 조명 효과를 구현할 수 있으며 텍스처 좌표 애니메이션을 통하여 스포트라이트가 움직이는 것처럼 나타낼 수도 있다.

일반적으로 정반사의 경우 하이라이트 표면이 급격하게 변하므로 잘 쓰이지 않는다.

3차원 텍스처 조명 맵이 있다.
실제 광선들이 볼륨 안에 저장된다. 메모리를 많이 사용하지만 빛이 실제 공간에 들어가있다는 점에서 유용하다.

5.7.3 광택 매핑(Gloss Mapping)
모든 물체의 부분이 균일한 광택이 나는 것이 아니다.
목조상의 흑요석(obsidian)과 타일 바닥은 여기저기 닳아 있어 광택이 같지 않다.

표면상의 정반사 성분의 기여도에 따라 적절하게 혼합하여 사용된다.

위의 조명 매핑과 광택 매핑으로 픽셀당 조명을 계산하면
O = t_diffⓧi_diff + t_gloss·i_spec
t_diff는 난반사 텍스처 맵
i_diff는 보간된 난반사 조명 색상
t_gloss는 단일값을 가지는 광택 맵
i_spec는 정점으로 부터 보간된 하이라이트

5.7.4 환경 매핑(Environment Mapping)
반사 매핑(reflection mapping)이라고도 불리는 환경 매핑(Environment Mapping : EM)은 곡면에서의 반사 효과를 근사하는, 단순하지만 강력한 방법이다.

광선 추적법(ray tracing)에서처럼 시점에서 가장 가까운 표면과의 교차점을 찾는 대신에 EM은 반사 벡터(reflection vector)의 방향을 환경에 포함하는 이미지에서의 인덱스로 사용한다.

Blinn과 Newell의 방법

처음으로 환경 매핑 방법을 개발했다. 환경 매핑된 각 픽셀에 대해 반사 벡터를 계산하고, 그 결과를 구 좌표(ρ,∮)로 변환한다.
ρ는 위도로 0에서 π라디안까지 변한다.
∮는 경도로 0에서 2π라디안까지 변한다.

r = r(r_x, r_y, r_z)는 정규화된 반사 벡터이다.
r = e - 2(n·e)n
e는 눈으로부터 표면의 특정 위치를 가르키는 정규화된 벡터
n은 표면 법선 벡터

ρ = arcos(-r_z)
∮ = atan2(r_y, r_z)

(ρ,∮)는 [0, 1)의 범위의 값으로 변환되며, 변환된 좌표는 텍스처의 (u, v)좌표로 사용된다.
u는 경도, v는 위도이다.

구현은 간단하지만 몇가지 문제점이 있다. ∮ = 0인 곳에 경계선이 존재하게 되고, 맵의 극점이 수렴하게 된다.

현재 많이 쓰이지 않는다.

정육면체 환경 매핑(Cubic Environment Mapping)

Blinn과 Newell의 방법에 비해 비교적 빠르고 실시간으로 생성할 수 있다. 


'IT 개발, develop > Image processing' 카테고리의 다른 글

A* 알고리즘  (0) 2015.09.16
화면 출력하기 convert to HBITMAP  (0) 2015.09.16
색체심리학 개요  (0) 2015.09.16
색관련사이트  (0) 2015.09.16
비트레이트(Bitrate)  (0) 2015.09.16

댓글