OpenGL로 배우는 3차원 컴퓨터 그래픽스 - 목차 / 단원별 요약
Chapter 01 컴퓨터 그래픽스
Chapter 02 그래픽 하드웨어
Chapter 03 그래픽 컬러 처리
Chapter 04 오픈지엘 API
Chapter 05 오픈지엘 기본 틀
Chapter 06 모델 변환과 시점 변환
Chapter 07 투상 변환과 뷰 포트 변환
Chapter 08 가시성 판단
Chapter 09 래스터 변환
Chapter 10 조명과 음영
Chapter 11 텍스처
Chapter 12 프래그먼트 연산
Chapter 13 고급 렌더링
Chapter 14 스플라인
Chapter 15 그래픽스 응용
Part 01 기초 다지기
Chapter 01 컴퓨터 그래픽스
01 컴퓨터 그래픽스의 응용
02 컴퓨터 그래픽스 기술의 변천
03 컴퓨터 그래픽스 구성 요소
Chapter 02 그래픽 하드웨어
01 그래픽 하드웨어 종류와 작동 원리
02 래스터 그래픽 장치
03 벡터 그래픽 장치
04 그래픽 출력 장치
05 그래픽 프로세서
Chapter 03 그래픽 컬러 처리
01 컬러 이론
02 컬러 모델
03 컬러 모드
04 하프 토우닝과 디더링
05 감마 수정
Part 02 오픈지엘 소개
Chapter 04 오픈지엘 API
01 그래픽스 표준
02 API
03 오픈지엘 개괄
04 오픈지엘 프로그래밍
05 오픈지엘 설치와 설정
Chapter 05 오픈지엘 기본 틀
01 그래픽 입력 장치
02 입력 모드
03 지엘 프로그램의 예
04 윈도우와 뷰 포트
05 콜백 프로그래밍
06 애니메이션과 더블 버퍼링
07 정점 배열
08 디스플레이 리스트
Project I Modeling
Part 03 그래픽 파이프라인
Chapter 06 모델 변환과 시점 변환
01 좌표계
02 기하 변환
03 지엘의 모델 변환
04 지엘의 시점 변환
Project II 모델 변환 및 시점 변환
Chapter 07 투상 변환과 뷰 포트 변환
01 투상
02 지엘의 투상 변환
03 지엘의 뷰 포트 변환
04 지엘 프로그램의 예
Project III 투상 변환 및 애니메이션
Chapter 08 가시성 판단
01 벡터
02 후면 제거
03 절단 알고리즘
04 지엘의 절단
05 은면 제거
06 지엘 프로그램의 예
Chapter 09 래스터 변환
01 래스터 변환
02 선분의 래스터 변환
03 다각형의 래스터 변환
04 보간법
05 지엘의 그래픽 기본 요소
06 비트맵과 포스트스크립트
07 에일리어싱과 앤티 에일리어싱
Chapter 10 조명과 음영
01 조명
02 지역 조명 모델
03 음영
04 지엘의 조명과 음영
05 지엘 프로그램의 예
Chapter 11 텍스처
01 텍스처 맵
02 텍스처 매핑 기법
03 앤티 에일리어싱
04 지엘의 텍스처 매핑
05 지엘 프로그램의 예
Project IV Scene Generation
Chapter 12 프래그먼트 연산
01 지엘 파이프라인
02 지엘의 버퍼
03 프래그먼트 연산
04 화소 연산
05 A-버퍼
06 비트맵 파일 읽기
07 지엘 프로그램의 예
Part 04 그래픽 이론
Chapter 13 고급 렌더링
01 그림자
02 레이트레이싱
03 레디오서티
Chapter 14 스플라인
01 스플라인
02 스플라인 곡선
03 스플라인 곡면
04 2차 곡면
05 지엘 프로그램의 예
Chapter 15 그래픽스 응용
01 공간 자료 구조
02 모델링
03 프랙탈
04 파티클 시스템
05 모핑
06 애니메이션
07 가상 현실
08 GLSL
09 OpenGL ES
Part1. 기초 다지기
01. 컴퓨터 그래픽스
1. 컴퓨터 그래픽스 기술은 이미 우리 일상생활에 깊숙이 침투하여 활용되고 있으며, 점차 더 나은 기술이 모색되고 있는 실정. 물론 컴퓨터 그래픽스 기술도 처음에는 '선이나 원을 어떻게 그릴 것인가'하는 아주 단순한 연구에서부터 출발. 컴퓨터 그래픽스 기술은 발전을 거듭하고 있으며, 이제는 게임, 영화, 가상 현실 등에 없어서는 안 될 중요한 요소로 간주되고 있음. 컴퓨터 그래픽스 이론은 크게 모델링과 렌더링 분야로 나눌 수 있음.
02. 그래픽 하드웨어
1. 하드웨어 발전으로 개인용 컴퓨터만으로도 과거 워크스테이션 수준의 그래픽 처리가 가능하게 됨. CRT(대표적인 출력 장치)에서의 전자빔의 세기는 제어 그물에 의해 조절되며, 전자빔의 방향은 편향판에 의해 조절됨. 컬러 모니터에서 화소의 색 : R, G, B 색을 띤 인점에서 나오는 빛의 조합으로 표시됨.
2. 래스터 그래픽 장치 : 그림의 사각형 화소 단위로 표시하기 때문에 유한 해상도를 지니며, 에일리어싱이 일어날 수 있음.
래스터 장치 : 그림 자체를 프레임 버퍼 메모리에 저장
3. 벡터 그래픽 장치 : 모든 것을 무한 해상도를 지닌 선으로 묘사. 평판형 디스플레이 중 LCD - 블라인드 커튼, 플라즈마 - 형광등에 비유 가능
4. 그래픽 카드 : CPU 처리 부담을 줄이기 위한 것, 내부에 자체 프로세서와 자체 메모리를 내장하고 있음
03. 그래픽 컬러 처리
1. 색상 : 주요 주파수가 지닌 색, 채도 : 주요 주파수 에너지와 백색 에너지의 차이, 명도 : 전체적인 빛 에너지
2. 물리적인 R, G, B 광원으로는 색 매칭이 불가능하기 때문에 가상의 수학적인 함수에 의한 컬러 매칭이 필요 -> 'CIE 컬러 매칭'. CIE 색 범주에서 컬러 필름, 컬러 모니터, 컬러 프린터가 표현할 수 있는 색 범주는 제한적임
3. RGB 컬러 모델 : 가산 모델, 빛의 합성에 사용
CMY 컬러 모델 : 감산 모델, 물감의 합성에 사용
HSV 컬러 모델 : 화가의 셰이딩, 틴팅 개념을 도입함으로써 RBG 모델에 비해 더욱 직관적인 컬러 인식이 가능
CIE L*a*b 모델 : CIE 모델의 비선형성을 수정한 모델, 색 도표상의 거리가 실제 인식된 색차에 정비례하도록 수정한 것
4. 컬러 처리 시스템 : 출력 장비에 따른 색차와 사용된 컬러 모델에 따른 색차를 줄여서 호환성을 확보하기 위한 것. 이 시스템은 해당 그림을 만들 때 사용된 정보를 컬러 프로파일 형태로 저장. 이 경우 모든 컬러 모델은 표준 언어에 해당하는 sRGB 및 CIE L*a*b 모델을 거쳐 다른 컬러 모델로 변환됨
5. 인덱스 컬러 모드 : 제한된 프레임 버퍼로 더욱 많은 다양한 컬러를 만들거나 일정한 색조를 더욱 충실하게 표현하기 위한 것. 이 모드에서는 컬러 보기표를 통해 식제 색이 결정됨.
6. 디지털 하프 토우닝 : 해상도를 감소해서라도 표시 가능한 색상을 늘릴 때 사용되는 반면,
디더링 : 해상도 감소 없이 원 영상을 더욱 충실하게 표현하기 위해 사용
7. 모니터가 비선형적으로 동작해 프로그래머가 명시하는 회색도를 그대로 사용할 경우, 기대 값보다 더욱 어두운 영상이 나옴.
감마 수정 : 이를 방지하기 위한 것으로, 감마 수정에 의해 원래의 회색도보다 더욱 밝은 회색도를 프레임 버퍼에 기록함으로써 모니터가 비선형적으로 동작해도 결과는 기대 값과 일치하게 함
Part2. 오픈지엘 소개
04. 오픈지엘 API
1. 표준화 : 공유성, 재사용성 추구. 컴퓨터 그래픽 분야의 ISO 표준의 내용은 추상화 레벨에 따라 분류됨. ISO 표준은 2차원 그래픽 위주의 GKS와 3차원 그래픽 위주의 PHIGS가 있음
2. API를 사용하여 그래픽 라이브러리 함수를 호출함으로써 프로그램 작성이 용이해짐.
고수준 API : 장면을 묘사하는 함수로 이루어져 있으며, 묘사된 장면은 트리 형태로 표시할 수 있음 (VRML, Java3D, OpenInventor 등)
저수준 API : 모델링 대신 렌더링에 치중(지엘과 DirectX 등)
3. DirectX : 지엘에 비해 호환성이 떨어짐
지엘 : 범용성, 효율성, 독립성, 완전성, 상호 작업성 등을 고려하여 설계됨. 거대한 파이프라인 기계로서 파이프라인에 의해 동시 작업이 가능하고 따라서 고속 처리가 가능.
지엘 프로그램 : 단순히 이 파이프라인의 부분부분에 속성, 모드 등의 상태 변수를 제공.
4. 지엘 프로그램을 작성하기 위해서는 지엘 라이브러리 외에 GLU와 GLUT 등의 유틸리티가 필요.
GLUT : 지엘이 직접 수행할 수 없는 기능을 운영체제에 넘기기 위한 인터페이스 유틸리티로, 윈도우 관리 기능과 콜백 기능을 수행.
05. 오픈지엘 기본 틀
1. 논리적 입력 장치를 사용하면 입력 장치가 바뀌어도 동일한 프로그램을 재사용할 수 있음
2. 리퀘스트 모드와 샘플 모드에서는 프로그램이 주도권을 쥠.
리퀘스트 모드 : 프로그램이 입력을 요구하면 사용자는 메저를 입력하고 트리거를 가해야 함.
샘플 모드 : 현재 시스템에 들어와 있는 메저가 그대로 전달됨.
3. 이벤트 모드 : 프로그램이 입력 장치를 지정하지 않고 역으로 사용자가 입력 장치를 지정한다는 점에서 사용자가 주도권을 쥠. 이벤트 모드에서 입력에 대응하여 프로그램이 실행해야 할 행동은 콜백 함수에 의해 정의됨. 키보드, 마우스, 메뉴, 디스플레이, 리셰이프, 아이들, 타이머 등 다양한 콜백 함수가 존재.
4. GLUT의 화면 좌표계 : 윈도우 화면 좌표계와 마찬가지로 좌상단을 원점으로 함
GL의 화면 좌표계 : 좌하단을 원점으로 함
5. 더블 버퍼링 : 프레임 버퍼의 기록 속도와 검색 속도의 차이로 인한 불완전한 영상을 해소하기 위한 것
6. 물체를 구성하는 정점을 일일이 반복하는 대신 단 한번만 배열에 넣어 놓고 정점 리스트를 사용하여 이를 호출하는 것이 프로그램 작성 면에서 볼 때 효율적
7. 디스플레이 리스트는 기본 요소는 물론 명령어까지 컴파일된 형태로 저장하여 재사용함으로써 처리 속도를 획기적으로 높이는 데 사용함
8. 지엘에서 더블 버퍼링을 활용하기 위해서는 gluInitDisplayMode(GLUT_DOUBLE) 함수와 glutSwapBuffers( ) 함수를 사용해야 함
Part3. 그래픽 파이프라인
06. 모델 변환과 시점 변환
1. 물체의 경계면 표현에서는 물체면을 수많은 평면 다각형으로 표현. 다각형 중에서도 삼각형은 항상 평면을 보장하기 때문에 연산의 정확도를 기할 수 있음. 벡터는 방향과 크기만 있을 뿐 시작 위치가 지정되어 있지 않음.
어파인 공간 : 젝터에 점을 추가함으로써 벡터의 위치를 지정할 수 있도록 한 것
차원 : 점의 위치를 표현하기 위한 기반 벡터의 수
동차 좌표 : 공간에서 점과 벡터를 모두 동일한 방식으로 표현하기 위해 고안된 것. 이는 차원을 하나 증가시킨 것으로, 2차원 동차 좌표는 3개의 요소로, 3차원 동차 좌표는 4개의 요소로 표현됨
2. 그래픽에서 모든 기하 변환은 행렬의 곱셈 형태로 구현됨. 이동 행렬의 마지막 열에 이동 거리가 명시됨. 3차원 회전 변환은 항상 x, y, z축을 기준으로 가해짐. 크기 조절 변환에는 균등 크기 조절과 차등 크기 조절이 있음.
복합 변환 : 일련의 연속된 변환
복합 행렬 : 복합 변환을 하나의 행렬로 표시한 것
회전에는 원점 중심의 회전과 피벗 중심의 회전이 있음.
피벗 중심의 회전 : 복합 변환을 사용하여 구현 가능
구조 왜곡 변환 : 변환 후의 x, y, z의 값이 변환 전의 x, y, z에 의해 영향을 받는 것으로, 일반적으로 비선형 변환
어파인 변환과 원근 변환을 합쳐 선형 변환이라 함
3. 모델링의 기본 단위는 임의로 결정할 수 있으며, 모델 좌표계 역시 설계에 유리하도록 임의로 결정할 수 있음.
전역 좌표계 : 여러 모델 좌표계를 한꺼번에 아우르는 좌표계
지엘에서 처음에는 전역 좌표계와 모델 좌표계가 일치하지만 기하 변환을 가하면 모델 좌표계가 전역 좌표계로부터 분리됨.
모델 좌표계 기준의 물체 정점 좌표는 불변. 모델 행렬을 모델 좌표에 곱하면 전역 좌표가 얻어짐.
뷰 행렬을 전역 좌표에 곱하면 시점 좌표가 얻어짐.
지엘에서는 뷰 행렬과 모델 행렬을 곱한 값을 모델 뷰 행렬 하나로 처리.
4. 전역 좌표계를 기준으로 물체에 가해지는 변환으로 간주할 때 함수 호출 순서는 변환의 역순이 되어야 함. 모델 좌표계에 가해지는 변환으로 간주할 때의 함수 호출 순서는 변환과 동일한 순서가 되어야 함. 행렬 스택을 사용하면 이전의 모델 좌표계를 복원할 수 있음. 계층 구조 트리를 오르내리면서 팝과 스택을 반복하면 모델 좌표계를 이동할 수 있음.
5. 지엘의 시점 좌표 : 카메라 위치, 초점 위치, 카메라 기울임 등 3가지 파라미터에 의해 지정됨.
07. 투상 변환과 뷰 포트 변환
1. 투상 : 3차원 물체를 2차원 화면으로 사상하는 작업
시점에서 나가는 투상선이 모두 나란하면 평행 투상이며, 방사형으로 나가면 원근 투상
평행 투상에는 정사 투상, 축측 투상, 경사 투상 등이 있음
원근 투상에서는 멀리 있는 물체가 작게 보임
2. 지엘의 투상은 GL_PROJECTION 상수로 대변되는 투상 행렬을 사용해 이루어짐.
가시 부피는 좌/우/하/상/전/후 파라미터 값에 의해 결정됨.
프로그래머가 지정한 가시 부피는 지엘이 의해 정규화 가시 부피로 바뀜.
정규화 가시 부피를 기준으로 절단이 이루어지기 때문에 이를 '절단 좌표계'라 부름
3차원에서 2차원으로의 투상은 절단 작업 이후에 이루어짐
평행 투상의 가시 부피는 육면체이지만, 원근 투상의 가시 부피는 절단 사각뿔 모습
3. gluPerspective( ) 함수를 호출하면 시선이 가시 부피의 중심을 통과.
원근 변환의 결과, 시점에서 먼 곳의 불체 깊이는 더욱 촘촘해짐.
깊이 정보의 정확도를 기하기 위해서는 전방 절단면을 시점에서 멀게하는 것이 좋음.
gluPerspective( ) 함수 파라미터 : 시야각, 종횡비, 전방 절단면, 후방 절단면.
시야각을 넓히는 것은 광각 렌즈로 촬영하는 것을 의미하며, 반대로 시야각이 좁으면 망원 렌즈로 촬영하는 것을 의미
4. 원근 분할 : 원근 투상의 결과 생성되는 동차 좌표(x, y, z, w)를 (x/w, y/w, z/w, 1)로 바꾸는 작업
절단 좌표에 원근 분할을 가하면 정규화 장치 좌표로 바뀜.
여기에 뷰 포트를 가하면 화면 좌표로 바뀜. 뷰 포트 변환은 glViewport( ) 함수에 의해 정의됨.
뷰 포트 변환 가정에서 재 정규화가 가해지면 가시 부피의 깊이는 [0, 1] 사이로 사상됨.
종횡비 차이에 따른 왜곡을 방지하려면 가시 부피의 종횡비를 뷰 포트 종횡비에 맞춰 조정하면 됨.
08. 가시성 판단
1. 보이지 않는 부분을 제거하는 작업 : 후면 제거, 절단, 은면 제거로 나뉨.
후면 : 시점에서 멀어지는 방향의 법선 벡터를 지닌 면
물체면은 구체적으로는 표면과 이면으로 구성.
표면 : 시점에서 보았을 때 반시계 방향으로 표시한 면
시점이 결정되면 표면과 이면 중 하나만 보임.
2. 절단 : 물체면 중 가시 부피 내부에 존재하는 면만 걸러내기 위한 작업.
코헨-서더런드 알고리즘 : 아웃코드에 의해 절단 연산의 속도를 높인 것.
서더런드-핫지먼 알고리즘 : 절단 다각형을 기준으로 정점의 내부 이동 또는 외부 이동 시에 새로운 교차점을 계산하여 추가. 이 알고리즘은 모든 절단면에 대해 동일하게 적용되기 때문에 하드웨어화하기에 유리.
에일러-애서튼 알고리즘 : 절단에 의해 분리된 여러 개의 다각형을 생성하게 허용함으로써 오목 다각형의 절단에 유리.
3. 지엘의 절단은 4차원 절단 좌표계에서 일어남.
이를 원근 분할한 결과인 3차원 정규화 장치 좌표계에서 절단을 가하지 않는 이유 : 시점 뒤쪽에 있는 물체 처리 시 발생하는 오류 때문
유의 : 4차원에서 절단은 상대적으로 빠르고 간단하지만 동차 좌표의 마지막 요소 w에 따라 서로 다른 방법으로 처리해야 한다
w가 양인 지역에서만 절단 처리 시간이 단축됨
4. 은면 제거 : 화소 공간 알고리즘으로, 앞면에 가려서 보이지 않는 부분을 제거하기 위한 것
페인터 알고리즘 : 먼 곳에서 가까운 곳으로 순차적으로 덧칠하는 방법으로, 소프트웨어에 의한 은면 제거 방법.
그러나 이 알고리즘은 다양한 경우를 처리해야 하기 때문에 처리 속도가 떨어짐.
깊이 : 정점의 z좌표
지-버퍼 : 화소별로 깊이를 저장하기 위한 메모리
주어진 화소로 사상되는 물체면의 깊이가 현재 지-버퍼의 깊이보다 작으면, 지-버퍼와 프레임 버퍼가 동시에 새로운 내용으로 기록됨.
물체면 내부의 깊이와 색 : 정점의 깊이와 색으로부터 보간에 의해 구해짐
09. 래스터 변환
1. 뷰 포트 변환 결과 부동 소수로 표시된 물체의 정점은 래스터 변환에 의해 정수 단위의 화소 좌표로 바뀜
래스터 변환 : 정점뿐만 아니라 선분 위의 모든 점, 다각형 내부를 어떤 화소로 표현해야 할 것인지를 결정하는 작업
지-버퍼 알고리즘에 의한 은면 제거 : 래스터 변환과 동시에 이루어짐
2. 선분의 래스터 변환에서 교차점 계산 알고리즘은 부동 소수 곱셈으로 인해 속도가 느려짐
DDA 알고리즘 : 이를 부동 소수 덧셈으로 대치한 것
브레스넘 알고리즘 : 모든 것을 정수 연산으로 바꾼 것, 가장 빠름
3. 일반적으로 화소의 좌표는 화소 좌하단 모서리를 기준으로 부여됨.
그래픽 수식 표현에는 현시적 표현, 묵시적 표현, 파라미터 표현 등 세 가지 방법이 사용됨.
삼각형 내부를 래스터 변환할 때 묵시적 표현을 쓰면 진행 선분을 기준으로 왼쪽에 있는 것이 삼각형 내부
주사선 채움 알고리즘에 의해 다각형을 래스터 변환할 때는 홀수 규칙 사용.
이 경우 극대점은 0번, 극소점은 2번, 극대 및 극소점은 1번 교차한 것으로 간주해야 함
활성화 선분 리스트 : 주사선 채움 알고리즘에서 선분의 공간적 응집성을 활용하기 위한 것. 이는 주사선을 증가시키면서 새로운 선분을 활성화하는 방법.
4. 주어진 화소가 다각형 외부인지 내부인지를 판단하는 데도 홀수 규칙을 사용할 수 있으며, 논 제로 와인딩 규칙을 사용할 수도 있다. 씨앗 채움 알고리즘은 경계 채움 알고리즘과 홍수 채움 알고리즘으로 나뉨.
경계 채움 알고리즘 : 4-방향 또는 8-방향으로 경계 색상을 만날 때까지 채워 나가는 방법
홍수 채움 알고리즘 : 내부점의 색이 동일할 때까지 채워 가나는 방법
5. 무게중심 좌표 : 삼각형 내부를 세 정점의 합으로 표현했을 때의 계수
이 값은 삼각형의 면적비를 이용해 구해도 되지만, 양방향 선형 보간에 의해 구하는 것이 더욱 빠름. 무게중심 좌표는 주어진 정점의 색/깊이로부터 내부 화소의 색/깊이를 보간하는 데 사용됨
6. 비트맵 : 영상을 화소 단위 배열로 표현한 것으로, 확대 시에 에일리어싱을 수반
포스트스크립트 : 영상을 물체(객체) 단위로 명시한 것으로, 정점 좌표, 정점을 연결하는 곡선의 수식, 객체 속성 등에 의해 영상을 표현한 것
비트맵 영상 : 비트맵 파일 형식으로 저장됨
포스트스크립트 영상 : 그래픽 메타파일 형태로 저장됨. 이는 모델링 결과를 저장하는 것으로, 최종적으로는 렌더링 알고리즘이 가해져야 비트맵 단위로 화면에 뿌려짐
7. 에일리어싱 : 시간적 또는 공간적 언더 샘플링에서 비롯됨.
앤티 에일리어싱 방법 : 슈퍼 샘플링, 영역 샘플링
슈퍼 샘플링 : 실제 화면 해상도보다 더욱 큰 해상도로 샘플링한 후, 이를 평균하여 해당 화소에 적용하는 방법
영역 샘플링 : 물체가 차지하는 영역의 크기를 가중치로 하여 해당 화소의 색을 결정하는 방법. 이에는 동일 가중치, 피라미드 가중치, 원뿔 가중치 방식이 있음.
블러링 : 영상의 저주파 성분만을 걸러내는 저역 통과 필터를 사용한 결과
블러링에 의한 앤티 에일리어싱 : 빠르지만 실제 물체 색이 아니라는 점에서 정확도가 떨어짐
10. 조명과 음영
1. 조명과 음영을 합쳐 렌더링이라 부름
지엘의 조명은 시점 좌표계에서, 음영은 래스터 변환 단계에서 가해짐
전역 조명 모델 : 광원과 자체면과의 사이의 반사만을 감안
지역 조명 모델 : 지역 조명 모델을 구사하지만 편법적으로 전역 조명 모델의 기능을 일부 수용
2. 일정 면적을 지닌 광원 표면에서 나오는 모든 빛을 감안하기 어렵기 때문에 이를 점 광원으로 근사화시킴. 면적이 큰 광원일 경우 여러 개의 분산 점 광원으로 근사화함
위치성 광원에서 빛은 모든 방향으로 퍼짐
방향성 광원에서 빛은 일정한 방향으로 퍼짐
스포트라이트 : 위치성 광원이지만 빛이 일정 각도 범위 내로만 퍼짐
3. 지역 조명 모델 : 주변 반사, 확산 반사, 경면 반사로 구성
주변 반사 : 주변 물체에 부딪쳐 반사되는 빛을 감안한 것으로, 모든 물체면에 일정 크기의 밝기를 추가함
확산 반사 : 거친 면에 의한 난반사로 물체면에 부딪쳐 모든 방향으로 반사되는 빛을 감안한 것으로서, 물체면이 서 있는 방향에 따라 반사광 세기가 다름
경면 반사 : 매끄러운 물체에 의한 전반사, 입사각과 동일한 크기의 반사각 형태로 진행함. 이 진로에서 시점이 벗어나면 반사량은 코사인 분포에 의해 줄어듦.
4. 음영 : 물체면 내부 화소의 컬러를 채우는 작업
플랫 셰이딩 : 내부를 모두 동일한 색으로 채우는 것으로 현저한 마하 밴드 현상을 보임
구로 셰이딩 : 정점의 컬러로부터 보간에 의해 내부 면을 채우는 것. 이 경우 정점의 법선 벡터는 인접 면의 법선 벡터로부터 구해짐
퐁 셰이딩 : 컬러를 보간하는 대신 법선 벡터를 보간하는 것. 원 물체의 기울기를 복원하기 때문에 상대적으로 정확한 렌더링이 가능
구로 셰이딩에서는 경면광을 포함하지 않는 반면, 퐁 셰이딩에서는 경면광을 포함할 수 있음
5. 지엘에서 조명과 음영을 가하기 위해서는 조명 기능 활성화, 광원 정의, 음영 모드 정의, 법선 벡터 정의, 물체면의 특성 정의, 조명 모델 설정 등 여러 단계를 거쳐야 함.
11. 텍스처
1. 텍스처를 부여하면 물체의 현실감을 높일 수 있음
원래 텍스처는 물체 표면의 재질을 표현하기 위한 것으로 물체면을 아주 작은 다각형으로 분할하여 서로 다른 색상과 법선 벡터를 정의하는 것을 의미했지만 프로그램 실행 시간이 엄청나게 늘어남. 이보다는 촬영된 영상을 물체면에 그대로 입히는 것이 효율적이기 때문에 이것이 일반적인 텍스처의 의미가 됨
2. 평면 다각형의 텍스처 매핑은 물체 정점마다 텍스처 좌표를 부여하면 됨. 다각형 내부 화소의 텍스처는 무게중심 좌표를 기준으로 정점의 텍스처 좌표를 보간하며 구할 수 있음. 파라미터로 표현된 곡면의 텍스처 매핑은 파라미터를 사용하면 됨
파라미터로 표현할 수 없는 곡면인 경우에는 S 매핑과 O 매핑을 가해야 함
S 매핑 : 평면 텍스처를 중개 곡면에 입히는 작업으로, 중개면으로는 원기둥, 원구, 육면체 등이 사용됨
O 매핑 : 텍스처가 입혀진 중개면으로부터 원래의 물체에 텍스처를 입히는 작업 . O 매핑에는 물체면 법선 벡터, 물체면 중심, 중개면 법선 벡터, 시점 벡터 등을 기준으로 하는 방법들이 있음.
주변 매핑 : 주변 환경이 물체 표면에 비친 모습을 생성하기 위한 것으로, 물체를 중심으로 180도 또는 360도 시야각 범위에 있는 주변 모습을 텍스처 영상으로 사용
3. 픽셀에서 텍셀로의 매핑 또는 텍셀에서 픽셀로의 매핑 : 비선형 매핑으로서의 모습뿐만 아니라 면적까지 비선형적으로 변함
점 샘플링 : 텍스처 좌표가 속한 텍셀의 색을 그대로 취하는 것, 이 경우 일반적으로 에일리어싱을 수반
앤티 에일리어싱을 위해서는 양방향 선형 보간을 사용할 수 있음
밉 매핑 : 여러 텍셀을 평균 내어 사용하는 방법. 저역 통과 필터에 의한 앤티 에일리어싱으로서 화면 해상도별로 필요한 텍스처를 미리 저장하기 때문에 매핑 속도가 향상됨.
4. 지엘의 텍스처는 수동 또는 자동으로 할당됨
자동 텍스처 매핑의 경우 물체 정점과 기준 평면의 거리를 기준으로 텍스처 좌표가 할당됨
텍스처 파라미터 함수 : 2종류의 파라미터를 설정하는 데 사용됨
래핑 모드 : 주어진 텍스처를 어떻게 확장하느냐를 결정
필터 모드 : 보간 방법 및 앤티 에일리어싱과 연관되어 있음
텍스처 환경 함수를 사용하면 물체색과 텍스처 색을 임의로 조합할 수 있음
12. 프래그먼트 연산
1. 지엘은 3차원 정점 처리와 함께 2차원 영상 처리 기능을 가지고 있음
3차원 정점 : 모델 뷰 변환, 투상 변환 등의 파이프라인을 거쳐 래스터 변환 프로세서로 입력됨
영상 : 이와는 별도로 화소 파이프라인을 거쳐 래스터 변환 프로세서로 입력됨
두 가지 경우 모두 래스터 변환 결과 프래그먼트가 생성됨
하나의 프래그먼트는 하나의 화소로 매핑될 데이터를 지닌 단위로, 화소의 색, 깊이, 텍스처 등의 정보를 지님
이들 프래그먼트에 대해 일단 텍스처 매핑, 컬러 섬, 안개 함수가 계산된 후, 프래그먼트 테스트가 가해짐
2. 시저 테스트 : 절단에 의해 화면의 변화를 뷰 포트 내부의 일정 사각형 영역으로 제한하는 것. 그 결과 사각형 밖의 프래그먼트는 제외됨
알파 테스트 : 불투명도를 기준으로 프래그먼트를 제외하는 것
스텐실 테스트 : 스텐실 버퍼에 기록된 임의 모습을 기준으로 프래그먼트를 제외하는 것
깊이 테스트 : 깊이 값을 기준으로 프래그먼트를 제외하는 것
3. 이러한 테스트를 통과한 프래그먼트에 대해 다시 블렌딩, 디더링, 논리 연산이 실행됨
블렌딩 : 소스 프래그먼트와 프레임 버퍼의 대상 화소를 혼합하여 다시 대상 화소로 저장하는 작업. 여기서 혼합을 위한 가중치에 해당하는 것이 혼합 인수. 안개 효과 역시 블렌딩의 일종으로, 멀리 있는 물체가 더욱 흐리게 보이게 하기 위한 것
지엘의 디더링 : 하프토우닝을 포함하는 개념으로, 그래픽 카드마다 처리 방법이 다름
논리 연산 : 프래그먼트에 가해지는 최종 작업. 이 역시 소스 프래그먼트와 프레임 버퍼의 대상 화소에 대한 연산이지만 비트 단위의 논리 연산에 의해 대상화소 값을 변경할 수 있음
4. 화소 파이프라인을 통해 입력 되는 영상은 비트맵과 화소맵으로 구분됨
비트맵 : 영상이라기보다 일종의 마스크로, 영상 내부의 값에 따라 화소별로 프레임 버퍼의 색 또는 정의된 색이 선택됨
화소맵 : 이러한 마스크 기능을 위한 것이 아니라 실제 영상의 컬러를 저장한 것
5. A-버퍼 : 일반적으로 여러 개의 물체(객체)를 연결 리스트로 저장하는 버퍼로, 내부에 컬러, 투명도, 깊이, 화소 점유율 등의 정보를 지니고 있음
지엘의 A-버퍼 : 여러 개의 영상을 중첩하는 데 사용. 이는 떨림에 의한 화면 단위의 앤티 에일리어싱에도 사용되지만, 초점에서 먼 곳의 물체를 흐리게 하거나 모션 블러 효과를 내는 데도 사용됨
Part4. 그래픽 이론
13. 고급 렌더링
1. 그림자 : 상대적으로 간단한 연산만으로 장면의 현실감을 높일 수 있는 방법
점 광원의 그림자는 본영만 있지만 면적 광원은 본영과 반영이 공존
지면 그림자 : 광원과 개별 물체면의 관계에 의해 지면에 그려지는 그림자
섀도 맵 : 섀도 지-버퍼를 사용하여 광원을 시점으로 하여 광원에서 가장 가까운 물체의 깊이를 저장함. 그런 다음, 실제 시점에서 가장 가까운 화소를 대상으로 해당 화소에서 원까지의 거리와 섀도 깊이 버퍼에 저장된 거리를 비교함. 광원까지의 거리가 섀도 깊이 버퍼보다 크면 해당 화소는 그림자 내부에 있다고 판단
크라우의 그림자 부피 : 그림자에 형성되는 부피와 가시 부피가 교차하는 곳을 그림자 영역으로 간주. 이는 실제로 지-패스 알고리즘 또는 지-페일 알고리즘으로 구현됨
2. 레이트레이싱과 레디오서티는 전역 조명 모델로, 물체면 사이의 반사까지 감안
레이트레이싱에서 주어진 면의 밝기는 그림자 광선, 반사 광선, 굴절 광선까지 추적하여 계산. 그림자 광선과 광원 사이에 어떤 물체가 있으면 주변광만 감안하고, 그렇지 않으면 주변광, 확산광, 경면광 등 지역 조명 모델의 3가지 성분 모두를 감안. 반사 광선과 굴절 광선의 추적은 재귀적으로 이루어지며, 이는 레이 트리로 표현할 수 있음. 레이트레이싱의 연산 시간을 줄기이 위해서는 병렬 처리하거나, 광산의 세기가 임계치 이하로 내려갈 때 추적을 그만두거나, 경계 부피를 사용하여 교차점 계산에 걸리는 시간을 줄이는 방법을 사용
3. 레디오서티는 에너지 보존 법칙을 이용
물체면 상호간에 단위 시간당 교환되는 에너지의 총량은 일정하다는 전제하에서 물체면 사이에 교환되는 에너지의 양을 선형 연립 방정식으로 공식화하여 방정식의 해를 구함. 이 경우 레디오서티는 어떤 다각형에서 나오는 빛의 밀도를 말하며, 여기에 다각형 면접을 곱하면 해당 다각형에서 단위 시간당 나오는 에너지가 됨
레이트레이싱은 시점에 영향을 받지만 레디오서티는 시점에 무관. 레이트레이싱은 경면광, 굴절광 위주로 추적하기 때문에 반짝이거나 투명한 물체를 그려내는 데 유리한 반면, 레디오서티는 확산광 위주로 추적하기 때문에 실내의 은은한 조명을 그리는 데 유리
14. 스플라인
1. 스플라인 : 곡선 또는 곡면을 모델링하기 위한 기본 도구. 제어점의 추가, 삭제, 이동에 의해 스플라인 모습을 제어할 수 있음
보간 스플라인 : 제어점을 정확히 통과
근사 스플라인 : 일반적으로 제어점을 통과하지 않음
그래픽스에서는 일반적으로 3차 다항식을 사용하며 구간별로 서로 다른 계수의 다항식이 사용됨. 구간별 다항식을 사용하는 이유 : 낮은 차수를 사용함으로써 하나의 제어점을 변경한 결과가 해당 제어점 부근에만 적용되도록 지역성을 높이는 데 있음.
제어 그래프 : 제어점을 연결한 다각형
스플라인이 컨벡스 헐 특성을 가지려면 곡선상의 모든 점이 제어 그래프에 의해 이루어지는 컨벡스 헐 내부에 존재해야 함
2. 점을 선형 조합하면 선분이, 선분을 선형 조합하면 곡선이 됨.
카디날 스플라인 : 곡선을 선형 조합하면 중간에 굴절이 있는 곡선이 됨
허미트 스플라인 : 양끝의 위치와 기울기에 의해 정의됨
베지어 스플라인 : 역시 선형 조합에 의한 것으로, 번스타인 기반 함수로 표현할 수 있음
구간별 베지어 곡선을 연결할 때는 시각적 연속성만 보장되면 됨.
중전 분할 : 재귀적으로 베지어 곡선을 그리는 방법
3. B-스플라인 : C2 연결성을 보장하는 부드러운 곡선. 곡선 중간중간에 나트를 설정하고 나트 값을 변경함으로써 곡선 모습을 제어하기도 함.
균등 B-스플라인 : 나트 간격이 균등할 경우
차등 B-스플라인 : 나트 간격이 불균등할 경우. 나트 값이 한번 중복될 때마다 연속성이 하나씩 감소
원근 변환된 물체 모습을 표현하려면 유리 B-스플라인을 사용해야 함.
너브스 : 차등 유리 B-스플라인. 너브스 곡선에서는 나트의 간격, 나트 반복, 가중치 등 세 가지 방법으로 곡선의 모습을 제어할 수 있음
중점 분할 방식을 사용하면 하나의 베지어 곡선을 분할하여 더욱 정밀한 제어를 가할 수 있음. 너브스 곡선의 경우 나트를 추가함으로써 곡선을 분할할 수 있음
4. 스플라인 곡선을 양방향으로 확장하면 스플라인 곡면이 됨. 이는 경계점, 경계 곡선 등을 양방향으로 보간하여 구할 수도 있음
허미트 곡면 : 4개의 모서리 점의 위치, 양방향 벡터, 트위스트 벡터에 의해 정의됨
베지어 곡면, B-스플라인 곡면 : 양방향 곡선을 직접 곱한 직교적으로 표시됨
2차 곡면 : 파라미터 표현 대신 곡면을 묵시적으로 표현한 것
GLU 라이브러리 함수를 호출하면 2차 곡면, 너브스 곡면 등을 그려낼 수 있음
15. 그래픽스 응용
1. 쿼드트리 : 공간적 응집성을 이용하여 물체가 분포한 부분만 집중적으로 저장하는 방법
옥트리 : 2차원 쿼드트리를 확장한 것
복셀 : 물체 내부를 모델링하기 위한 기본 단위
쿼드트리, 옥트리는 공간 분할이 일정하게 이루어지는 것에 비해 KD 트리는 물체의 분포를 감안해 공간을 분할
KD 트리의 분할 경계선이 수직, 수평선인 반면 BSP 트리의 분할 경계선은 사선이 될 수 있음
2. 로프팅 : 형상과 경로에 의해 물체면을 모델링하는 방법
CSG : 기본 물체에 대한 불리언 연산에 의해 복합물을 구성하는 방법으로, 복합물 자체가 다시 더 복잡한 복합물을 구성하는 기본 물체로 사용될 수 있음
매스-스프링 모델 : 탄성 물체를 모델링하기 위한 방법
마칭 큐브 알고리즘 : 일련의 평면 영상으로부터 3차원 부피를 재구성하기 위한 방법
3. 프랙탈 : 자연적인 모습이 반복 변환에 기초하고 있다는 점을 이용한 것
파티클 시스템 : 복잡한 물체를 개별 입자의 집합으로 표현한 것, 시스템 내의 개별 파티클은 여러 가지 속성을 지님
스프레이 렌더링 : 원하는 부분의 모습만 가시화하는 기법
상호 혼합에 의한 모핑은 화소 단위의 색을 보간하지만 메시 워핑에 의한 모핑은 제어점의 위치 이동까지 보간
4. 키프레임 애니메이션에서는 원화 사이를 메꾸는 동화는 컴퓨터에 의해 생성될 수 있음
5. GLSL : 파이프라인 일부를 사용자 프로그램으로 대체한 것
6. OpenGL ES는 모바일 기기 및 임베디드 장비의 그래픽 처리를 위한 API로서 OpenGL API의 부분 집합으로 볼 수 있음