Game Programming Gems 1
1.0 데이터 주도적 설계의 마법
- 요즘은 당연한 내용. 이런걸 쓰자라고 가볍게 얘기하는 챕터.
- 조건 분기 방식을 하나로 통일하는게 편하다고 한다.
- < 나 = 를 사용한 연산자 혹은 IsLifeBelowPercent()와 같은 평가 함수.
- 이쪽 생각을 안 해봤는데, 굳이 이런걸 하나로만 통일해서 쓸 필요까지 있을까 싶다.
- 스크립트를 사용하면 어디부터 스크립트를 사용할 지 고민하게 된다.
- 복잡한 건 코드로 빼고 스크립트는 최대한 단순하게 하자고 주장.
- 스크립트로 만들고 성능에 영향을 주는 부분을 코드로 만들자는 루아를 이용한 민첩하고 효과적인 게임 개발과는 반대 의견.
- 난 개발 중 자주 바뀌는 부분이나 이 부분을 스크립트로 하자고 정한 부분을 스크립트로 짜는게 맞다고 생각.
- 데이터 상속을 사용하자
- 글쎄. 해보진 않았지만 게임 디자이너가 익숙하고 쉽게 사용할 수 있는 excel 테이블이 낫다고 생각.
- 데이터를 만드는 도구를 작성하자고 하는데
- 파는 엔진을 만드는게 아니라면 난 결사 반대.
- 이미 잘 만들어지고 검증된 좋은 툴(excel 등)이 많다. 이걸 최대한 활용하자.
저자
- The Magic of Data-Driven Design - Steve Rabin
1.1 객체 지향적 프로그래밍과 설계 기법
- OOP 간단한 소개. singleton, facade, state, factory 패턴 소개. 영양가 없음.
- 헝가리식 표기법을 제대로 모르고 있다.
- 우리만 오해하고 있었는데, 양키 대부분도 오해하고 있었구나.
- 타입이 아니라 의미를 나타내는 접두어를 붙이는게 헝가리식 표기법이다.
- 나도 최근에 조엘 온 소프트웨어를 넘어서(More Joel on Software) 보고 알았으니깐.
저자
- Object-Oriented Programming and Design Techniques - James Boer
reference
1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
- 실행시간이 더 중요하니 컴파일 시간에 할 수 있는 계산들을 템플릿을 사용해서 하자. 실전에는 사용 안 할 것들. 이런 걸 템플릿으로 할 수 있구나하고 재미로 보면 좋을 챕터
- 요즘 컴파일 시간이 너무 중요하다. 규모가 커지니 컴파일 시간을 꾸준히 관리 안 하면 뒤에 생산력이 너무 떨어진다.
- 템플릿 활용은 Modern C++ Design 책에서 더 많이 배울 수 있다.
저자
- Fast Math Using Template Metaprogramming - Pete Isensee
1.3 자동적인 단일체 유틸리티
- 별로. loki 싱글톤을 살펴보는 게 더 도움이 된다.
- meyers singleton
- local static variable
- 처음 로직 흐름에 나타났을때 초기화.
- 단 소멸 시점을 제어하지 못한다.
- 소멸 시점을 제어할 수 있는 싱글톤을 만들고 템플릿으로 확장시키는 예제.
저자
- An Automatic Singleton Utility - Scott Bilas
1.4 게임 프로그래밍에서의 STL 활용
- 별로. STL 간단한 소개.
저자
- Using the STL in Game Programming - James Boer
1.5 일반화된 함수-바인딩 인터페이스
- 함수 바인딩 인터페이스에서 제약을 피하고자 cdecl, stdcall 호출 규약을 사용하고 구현하는 내용.
저자
- A Generic Function-Binding Interface - Scott Bilas
1.6 범용 핸들 기반 자원 관리자
- 많은 API에서 애용한 핸들(handle) 개념을 사용하는 파일 관리자를 만드는 방법
- 스마트 포인터도 해결책 중 하나지만 ref counter 관리 부하때문에 핸들을 사용하기도 한다.
저자
- A Generic Handle-Based Resource Manager - Scott Bilas
see also
- game programming gems 4 - 유연한 즉석 객체 관리자
1.7 자원과 메모리 관리
- 메모리가 후달릴때 대용량 자원을 잘 다룰수 있는 자원 클래스와 자원 관리 클래스를 설계.
- 새로 할당해야 하는 메모리 사이즈가 남은 메모리 사이즈보다 크다면 Lock을 걸지 않은 자원은 다 해제 시키고 할당.
- 쓰기 전에 IsDisposed()로 확인 후에 새로 생성하던가 해서 써야 함.
- 레퍼런스 카운터를 외부에서 직접 설정하는데, 자원 인스턴스 복사에 대한 아무런 대비책이 없다. 하다못해 복사 생성자와 할당 연산자를 막아놓지도 않았음.
- 옛날이라면 몰라 지금은 도움이 하나도 안 되는 영양가 없는 챕터.
저자
- Resource and Memory Management - James Boer
1.8 빠른 데이터 로드 기법
- 인스턴스는 연속된 메모리 공간에 있다는 걸 이용해서 IO 하는 방법.
- 주의해야 할 게 많다.
- static, virtual function 안 됨.
- 정 하고 싶다면 이런 데이터는 POD로 만들어서 확실히 구분해줘야 함.
- 빠르게 로드하고 싶다면 여러 리소스를 패키징해서 읽지 이런 방법은 사용하고 싶지 않다.
저자
- Fast Data Load Trick - John M. Olsen
1.9 프레임 기반 메모리 할당
- 스택 방식 메모리 풀
- 이걸로 빠르게 할당, 해제.
- 단편화 방지.
- 해제 순서를 신경써야 한다.
저자
- Frame-Based Memory Allocation - Steven Ranck
1.10 간단하고 빠른 비트 배열
- STL에 1차원 비트 배열이 있지만 제대로 지원하지 않는 컴파일러들이 존재하고 복잡하게 구현되어 있어 확장하거나 수정하기가 대단히 힘들다.
- 그래서 간단하게 만들었다
- 옛날 얘기
- 걍 STL 쓰자.
저자
- Simple, Fast Bit Arrays - Andrew Kirmse
1.11 온라인 게임을 위한 프로토콜
- 체크섬(checksum)
- 패킷 변조를 식별할 수 있는 방법
- 약점
- 계산 코드가 클라이언트에 있다
- 패킷 리플레이에 무력
- 유효한 패킷을 잡아내고 다시 보내는 공격
- 패킷 리플레이 막기
- 결정적이고 재현 가능한 난수 발생기를 사용하고 이 난수를 패킷에 추가
- XOR 사용
- 두 번 사용하면 원래 비트배열이 나오는 성질을 이용
- 초기 버전부터 암호화 열심히 하자
- 크래커들이 분석한 결과로 지식을 축적하는 걸 방지.
- 변조를 막는 기초적인 기법을 쉽게 설명. 좋다.
- 관련이 없는 작업을 주로 하더라도 이 정도는 교양
저자
- A Network Protocol for Online Games - Andrew Kirmse
1.12 assert의 비법들
- 편하려면 이 정도는 최소한 있어야 한다고 생각되는 assert
- assert(state && exp)
- 실패시 소스 파일에 assert문으로 들어가게 하자
- 아무 처리도 안 했을때, assert.c 파일 안에 assert 문으로 들어감.
- _asm { int 3 }은 PC에서 브레이크 포인트를 거는 명령
- 이 후 이 assert 무시 옵션 넣기
- 스택 정보 보여주기
- 클립 보드에 정보를 붙여 넣기
- 테스터가 쉽게 오류 보고를 할 수 있도록
- 이 과정도 자동화해서 수집 서버에 바로 보내는 게 더 낫다.
- assert 확장은 DEBUGGING APPLICATIONS FOR .NET AND WINDOWS에서 잘 설명하니 참고
저자
- Squeezing More Out of Assert - Steve Rabin
1.13 Stats: 실시간 통계와 게임 내 디버깅
- 병목을 잡기 위한 프로파일링과는 다른 목적으로 설계
- 통계(statistics) 시스템을 만들어서 디버깅 목적으로 수치 통계를 수집하고 출력한다.
- 게임 데이터를 실시간으로 편집하는 기능도 지원
- 시스템이 복잡해지면 이런 기능을 넣기 힘들겠지만 진짜 있으면 정말 편리하다.
- 이 책에선 포인터를 Stats에서 가지고 있어 따로 업데이트 구문이 없이 역참조(dereference)해 표시하거나 값을 바로 수정하는 방법을 사용하고 있다.
저자
- Stats: Real-Time Statistics and In-Game Debugging - John M. Olsen
1.14 실시간 게임 내 프로파일링
- 프로파일링 이름 문자열을 id로 하는 프로파일러
- 재귀 호출 프로파일링 불가능
- 싱글 쓰레드 수집, 분석만 가능한 원시적인 프로파일러
- 영양가 없다. GDC10에 좋은 프로파일링 발표 자료가 있으니 이걸 참고
저자
- Real-Time In-Game Profiling - Steve Rabin
2.0 예측 가능한 난수
- 예측 가능한 난수를 이용해 우주를 생성하는 예를 보여준다.
- 우주 전체를 32비트로 저장
- 시드 선택이 중요하다
- 중복되지 않고 결정적이게
- 객체 특성이 시드 선택에 중요한 기준
- 예) 행성 : (x_position * y_position)
- 시드는 자식들에게 전파되는 경향이 있다.
- 은하수 위치로 시드를 만들고 나온 랜덤 값을 행성에 위치 값으로 설정
- 그리고 다시 행성 위치 값이 시드가 된다.
- 생각을 안 해봤던 주제여서 흥미로웠다.
저자
- Predictable Random Numbers - Guy W. Lecky-Thompson
2.1 보간법
- 프레임율에 의존적이 보간 방법
- 10 fps, 20 fps에서 결과물이 다름
- 부동소수점, 정수 연산 방법
- 프레임율에 독립적인 보간 방법
- 시간이 계산에 들어가서 프레임율에 영향을 받지 않는 계산 방법
- 선형 보간, 가속 감속 보간
저자
- Interpolation Methods - John M. Olsen
2.2 강체 운동 방정식들의 해법
- 평행 이동, 회전, 각 운동량, 관성텐서 설명.
- 이런 운동은 미분으로 기술되는 데 적분하는 가장 간단한 방법인 오일러 해법을 설명.
- 생략을 많이하고 설명. 정리 차원에서 읽는게 아니면 이해가 어렵다.
저자
- Integrating the Equations of Rigid Body Motion - Miguel Gomez
2.3 삼각 함수들에 대한 다항식 근사
- 테일러 급수, 라그랑쥬 급수
저자
- Polynomial Approximations to Trigonometric Functions - Eddie Edwards
2.4 수치적 안정성을 위한 암묵적 오일러 해법
- 명시적
- 구현 쉬움
- 오차가 지수적으로 누적
- 전단계에서 도함수를 평가
- 암묵적
- 현단계에서 도함수를 평가
- 시간 증가량이 커도 안정성에 영향을 미치지 않는다.
- 명시적보다 안정성이 장점
저자
- Using Implicit Euler Integration for Numerical Stability - Miguel Gomez
2.5 파형요소: 이론과 압축
- 파형요소(wavelets) 사용
- 압축법
- 수학 이론 분석 도구
- 데이터 분석 도구
- Haar wavelets 간단한 예제를 보여줌
저자
- Wavelets: Theory and Compression - Loic Le Chevalier
2.6 상호 작용적인 수면 시뮬레이션
- 2차원 파동 방정식을 일반적인 방법으로 계산
- 삼각 함수 값을 계산해야 하는게 속도에 치명적
- 점마다 사인 곡선 함수를 9번 계산
- 중심차분 근사(central difference approximation)
- 삼각 함수 값을 계산할 필요 없이 사칙 연산으로만 가능
저자
- Interactive Simulation of Water Surfaces - Miguel Gomez
2.7 게임 프로그래밍을 위한 사원수(쿼터니언)
- 수학적 기반을 포함한 간단한 소개
저자
- Quaternions for Game Programming - Jan Svarovsky
2.8 행렬-사원수 변환
- 사원수 곱으로 ’사원수 -> 행렬’ matrix M을 유도
- M으로부터 ’행렬 -> 사원수’ 유도
저자
- Matrix-Quaternion Conversions - Jason Shankel
2.9 사원수들의 보간
- 사원수 보간 기법(lerp, slerp, squad, spline) 설명
저자
- Interpolating Quaternions - Jason Shankel
2.10 최단호 사원수
\(\overline{q} v_0 = v_1\) 인 \(q\) 를 직접적인 방식으로 사원수를 생성해서 구한다.
왜?
- 벡터곱과 acos()를 사용하는 방법에서 발생 가능
- \(v_0\) 과 \(v_1\) 이 가까울수록 벡터곱이 작아지며 정규화할때, 수치적 불안정성이 생길 수 있음
저자
- The Shortest Arc Quaternion - Stan Melax
3.0 범용적이고 견고한 AI 엔진의 설계
- 메시지를 이용한 이벤트 주도적 상태 기계.
- AI 엔진 공부를 시작할 때 좋은 출발점.
저자
- Designing a General Robust AI Engine - Steve Rabin
3.1 유한 상태 기계 클래스
- FSM 시작점으로 참고하긴 별로.
- 실용적 예제로 본 게임 인공지능 프로그램하기를 보자. 이 아티클 보는 건 시간 낭비.
- 상태가 많아지면 중복코드가 많아 진다.
- State를 만들고 State::AddTransition() 함수로 상태간 전이를 한다.
- 이런식으로 짜는게 해법이긴 할텐데, 실제 코드에서 이런식으로 풀 수 있을런지는 안 해봐서 모르겠음.
저자
- A Finite-State Machine Class - Eric Dybsand
3.2 게임 트리
- 가능한 경우 수를 나타내는 트리를 깊이 우선 탐색으로 순회해서 원하는 값을 찾는 게임 트리를 설명.
- 체스나 보드 게임에서 많이 사용한다.
- 바둑에서는 수가 많아서 불가.
- Monte-Carlo Go라는 걸 쓰기도 한다는데 참고.
- Mini-Max : 상대방에 대한 최소값을 찾아서 자신에 대한 최대값을 얻는다.
저자
- Game Trees - Jan Svarovsky
3.3 A* 길찾기 알고리즘의 기초
- Dijkstra’s algorithm에 목표까지 비용을 추정하는 과정이 들어간 알고리즘.
- 이 추정을 heuristic이라 부름
- heuristic 비용을 0으로 하면 Dijkstra 알고리즘과 탐색 결과는 동일
- 왜 A*를 설명할 때, Dijkstra 언급을 빼는지 모르겠다.
저자
- The Basics of A* for Path Planning - Bryan Stout
reference
3.4 A*의 미학적 최적화
직선, 매끄러운 경로를 만드는 방법과 반응성을 높이는 팁
직선적 경로
- 경로를 다 구한 뒤 가공하는 게 아니라 수정하면서 경로를 구한다.
- 동일한 방향이 아니면 비용을 증가
매끄러운 경로
- 경로를 다 구한 뒤 Catmull-Rom으로 가공
계통적 경로 만들기 (hierarchical pathing)
- 한번에 목표점을 향한 경로를 만드는 게 아니다.
- 부목표를 갱신해가며 최종 경로를 만드는 방식
반응성을 최대화하려면
- 소리를 내서 경로를 구하는 시간을 벌어라.
- ’옛써’
- 곧 움직일거라는 애니메이션으로 시간을 벌어라.
- 총을 고쳐 잡기. 배기관에서 연기가 나옴.
- 이거 재미있다.
저자
- A* Aesthetic Optimizations - Steve Rabin
3.5 A*의 속도 최적화
A* 속도는 검색 공간 크기에 영향을 받기 때문에 검색 공간 최적화와 휴리스틱 비용에 대한 얘기.
검색 공간 최적화
- 검색 공간 단순화
- 사각 또는 육각형 격자, 다각형 바닥, 특수화된 다각형 바닥, 가시점 (point of visibility) 방식
- 계통적 길찾기 (hierarchical pathfinding)
알고리즘 최적화
휴리스틱 비용 (heuristic cost)
- 실제 비용보다 크면 ’목표로 돌진하면서 길을 찾는 방식’
- 실제 비용보다 작으면 ’돌아가는 길이 더 빠를수 있으니 최대한 많은 가능성을 시험하는 방식’
- 최적 경로를 찾으려면 과소평가가 필요
- 지리적 거리를 사용해 휴리스틱 비용을 계산
- 절대 과대평가할 위험이 없다.
- 적절한 과대 평가는 경로를 빠르게 찾게 한다.
- 결국 적당한 타협. 타협이 대세.
저자
- A* Speed Optimizations - Steve Rabin
3.6 네비게이션 메시를 이용한 단순화된 3D 이동과 길찾기
마음놓고 이동할 수 있는 2D 자유 공간, 네비게이션 메시(navigation mesh) 사용에 대한 기초 내용.
저자
- Simplified 3D Movement and Pathfinding Using Navigation Meshes - Greg Snook
3.7 플로킹:집단 행동을 흉내내는 간단한 기법
자동화된 에이전트(boid) 집단이 새떼나 물고기떼와 비슷한 집단 행동을 흉내. 상태 없는(stateless)알고리즘으로 임기응변적인 행동(emergent behavior)이다.
조타 행동 (steering behavior)
- 분리(separation)
- 정렬(alignment)
- 응집(cohesion)
네번째 규칙
- 회피(avoidance)
저자
- Flocking: A Simple Technique for Simulating Group Behavior - Steven Woodcock
reference
3.8 비디오 게임을 위한 퍼지 논리
이분법이 아닌 어느 정도라던가 얼마나 같은 말로써 수식되는 애매함을 기반으로 하는 퍼지 논리(fuzzy logic) 소개
저자
- Fuzzy Logic for Video Games - Mason McCuskey
reference
- ShaderX4 4.2 Eliminating Surface Acne with Gradient Shadow Mapping - 그림자 판별에서 fuzzy가 쓰임
3.9 신경망 입문
n 차원 공간을 여러 영역으로 분할하고 입력을 출력으로 고유하게 매핑하는 신경망을 소개.
저자
- A Neural-Net Primer - Andre LaMothe
4.0 OpenGL을 위한 정점 지정 최적화
- 함수 진입, 종료에 필요한 오버헤드를 줄이는 방법들 소개.
- 하나하나씩 지정하지 말고 한꺼번에 지정하자.
- glInterleavedArrays
- 컴파일된 정점 배열(compiled vertex arrays extension) 사용
- 드라이버에 할당된 메모리에 직접 저장.
- nVidia 확장 wglAllocateMemoryNV
- 걍 triangle보단 strip이나 fan 사용
저자
- Optimizing Vertex Submissions for OpenGL - Herb Marselas
4.1 정점의 투영 깊이값 조정
- 투영 행렬 자체를 수정해서 깊이 오프셋 효과를 얻는 방법.
- 구하는 과정에서 w 좌표에 영향을 안 미치고 z 좌표를 변경할 수 있게 1 +
epsilon 을 도입. - 투영 깊이를 조정할 수 있는 식을 얻고 적절한
epsilon 을 구하는 방법을 얘기한다.
저자
- Tweaking A Vertex’s Projected Depth Value - Eric Lengyel
4.2 벡터 카메라
- projection matrix를 만들 수 있는 정보를 담은 카메라
- 카메라 방향, 위치, 시야, 종횡비(aspect ratio)
- 이런 벡터로만 이루어진 카메라여서 벡터 카메라라 이름을 붙였다.
- 렌더링하는 객체 local 좌표계로 카메라를 변환. projection matrix를 만들어 스크린좌표를 구한다
- vertex는 변환하지 않고 카메라만 변환하기 때문에 25%정도 향상된다는 게 저자 주장
- 어차피 저 프로젝션 매트릭스도 정점에 곱해야하는데, 뭔가 성능향상에 대해 이해할 수 없는 챕터.
- 성능 향상을 얘기할 때, 좀 확실한 근거를 들어주면 좋겠다.
- 옛날 이야기.
- 벡터카메라를 쓰면 과연 성능이 올라갈까요? - gpgstudy
저자
- The Vector Camera - David Paull
4.3 카메라 제어 기법
- 카메라 제어 트릭
- FOV를 사용한 확대/축소
- 용수철 효과
- 미리 준비된 경로를 따라가는 카메라 제어 방법으로 B-스플라인과 Catmull-rom을 설명
저자
- Camera Control Techniques - Dante Treglia II
4.4 빠른 원통-절두체 교차 판정
- 원통(cylinder)와 frustum 사이 각도, 원 반지름, 평면 normal, 원통 양 끝점좌표로 유효 반지름을 계산
- frustum 평면들마다 유효 반지름을 구하고 그 만큼을 확장
- 이제 문제는 선분과 평면 교점으로 변한다.
저자
- A Fast Cylinder-Frustum Intersection Test - Eric Lengyel
4.5 3D 충돌 검출
경계구(bounding sphere) 충돌 검출
- 객체를 감싸는 구의 반지름을 비교
삼각형 단위 충돌 검출
- 삼각형을 포함하는 평면 방정식을 만든 후 매개변수 방정식을 사용해 선분-평면 교차를 검사
점이 삼각형 안에 있는지 점검
- 2차원으로 투영(projection)해서 세 변 직선 방정식을 사용해서 검사
저자
- 3D Collision Detection - Kevin Kaiser
4.6 다해상도 맵을 이용한 충돌 판정
- 격자로 맵을 나누고 격자를 충돌 판정을 할 오브젝트 리스트를 뽑는데 사용
- 격자마다 오브젝트가 여러개 있다.
- 충돌 검사를 할때, 오브젝트가 속하는 격자와 이웃 격자에 있는 오브젝트를 뽑아 충돌 검사
- 다양한 크기를 가지기 때문에 최적화된 격자 크기를 만들기가 힘들다.
- 그래서 다중 해상도 맵을 사용
- 해상도는 격자 크기를 나타낸다.
저자
- Multi-Resolution Maps for Interaction Detection - Jan Svarovsky
4.7 구역 안에서의 거리 계산
2D 사각형 두 변 사이에 위치값을 간단하고 빠르게 구하는 알고리즘
- 값은 [0, 1]
- 0은 시작 변, 1은 종료 변
- 계산에 시작 종료 변의 노멀 벡터를 사용
응용
- 트랙의 총 길이 구하기
- 매끄러운 조명 변화
- 레이싱 게임에서 중간 순위를 보여줄 때 응용해서 사용해도 괜찮을 듯.
저자
- Computing the Distance into a Sector - Steven Ranck
reference
4.8 가려진 객체의 제외 기법
미리 정의된 평면 사각형으로 오클루젼(occlusion) 영역을 만들어 안에 들어간 객체를 제외
저자
- Object Occlusion Culling - Tim Round
4.9 자연스러운 세부 수준 변화
LOD 구하기
- 카메라와 객체 사이 거리만 고려하면 안된다. 시야각도 고려해야 함
- 확대율(maginification factor)
- 객체 물리적 크기에 대한 객체의 화면 크기 비율
- M = xscale / zview
- 카메라 거리와 시야를 포괄하는 공식
LOD 변경 기준
- 단순 거리 문턱값(threshold) 대신 이력 문턱값(hysteresis threshold) 사용
- 상한, 하한 문턱값을 가짐
- 이전 출력값에 기반해 상한, 하한 중 어떤 문턱값을 적용할 것인지 결정
저자
- Never Let ’Em See You Pop - Issues in Geometric Level of Detail Selection - Yossarian King
4.10 옥트리의 구축
node마다 8개 자식 노드가 있는 트리. 2차원 쿼드트리에 축을 하나 추가한거라 생각하면 된다. 간단한 소개.
저자
- Octree Construction - Dan Ginsburg
4.11 느슨한 옥트리
- 노드 사이 경계면에 걸쳐진 경우 실제 크기보다 훨씬 큰 입방체에 저장하게 된다.
- 옥트리 공간 분할 효율성이 떨어지게 됨
- 느슨한(loose) 옥트리는 입방체 크기를 늘려 경계 입방체들 사이에 겹치는 부분을 허용해서 극복하려고 함
- 겹치는 부분을 허용해서 어느 한 노드 안에 들어갈 확률을 높인다.
- 느슨한 옥트리가 객체 대 객체 테스트 횟수는 적지만 객체 대 노드 테스트는 더 많음. 더 효율적으로 충돌 판정을 한다고 저자가 결론.
저자
- Loose Octrees - Thatcher Ulrich
4.12 뷰 독립적인 점진적 메싱
점진적 메시를 구현할 때 생기는 이슈들을 잘 정리해서 시작점으로 좋을 아티클.
점진적 메시(progressive mesh) 기본 개념
- 정점 분리(vertex split, vsplit)
- 세부 수준 증가
- 폴리곤 개수가 늘어난다
- 변 제거(edge collapse, ecol)
- 세부 수준 감소
- 폴리곤 개수가 줄어듬
변을 제거할 때 합쳐지는 정점 위치는?
- 중점을 선택하면 세부 수준이 감소할 때 부피가 줄어든다.
- 두 점 중 하나를 선택하는 걸 추천.
저자
- View-Independent Progressive Meshing - Jan Svarovsky
4.13 보간을 이용한 3D 키프레임 애니메이션
키프레임 사이에 보간 방법으로 Hermite 스플라인 보간을 소개
이유
- 선형 보간은 보간된 애니메이션 프레임이 더 크거나 작게 변형되기도 한다.
- B-스플라인은 추가적인 연속성을 제공하긴 하지만 보간된 곡선의 경향을 제어하기가 어렵다.
저자
- Interpolated 3D Keyframe Animation - Herb Marselas
4.14 빠르고 간단한 스키닝 기법
- vertex는 단 하나의 뼈대(bone)에 영향을 받는다.
- 스티칭(stitching)
- 원래 모델을 적절한 비율로 축소해 파트로 나눠서 bone으로 사용. 이때 bone으로 사용하는 정점들을 기록해 놓는다.
- vertex 에서 가장 가까운 bone 정점을 찾아서 그 bone의 transform을 사용하는 방법.
- 저자는 폴리곤 개수가 500개 이하인 오브젝트에 사용하기를 권함.
저자
- A Fast and Simple Skinning Techniques - Torgeir Hagland
4.15 틈 매우기 - 스티칭과 스키닝을 이용한 고급 애니메이션
스티칭과 스키닝 소개.
스티칭(stitching)
- vertex에 bone 하나만 영향을 준다.
스키닝(skinning)
- vertex에 bone 여러개가 영향을 준다.
- bone마다 가중치를 가짐.
저자
- Filling the Gaps - Advanced Animation Using Stitching and Skinning - Ryan Woodland
4.16 실시간 사실적 지형 생성
- 시드값을 사용하는 random 지형 생성. 사실적이진 않아.
저자
- Real-Time Realistic Terrain Generation - Guy W. Lecky-Thompson
4.17 프랙탈 지형 생성 - 단층 변형
- 단층 변형(fault formation) 알고리즘 소개
- 무작위 선을 그어 분할된 두 영역 중 한 영역 높이를 변형
- low-pass 필터인 FIR(finite impulse response) 필터를 사용해 침식 작용을 표현
- 인접한 영역 사이에 높이 차이를 줄여 부자연스러움을 없앤다.
저자
- Fractal Terrain Generation - Fault Formation - Jason Shankel
4.18 프랙탈 지형 생성 - 중점 높이 이동
- 플라즈마 프랙탈(plasma fractal) 또는 다이아몬드 사각형(diamond-square)이라 불리는 알고리즘 설명
- 히말라야 산맥을 만든 융기(uplift) 현상을 흉내내는 기법을 설명
- 사각형 중심 높이값에 네 모서리 높이값 평균에 적절한 난수를 더해서 할당. 범위를 좁혀가며 반복적으로 실행.
저자
- Fractal Terrain Generation - Midpoint Displacement - Jason Shankel
4.19 프랙탈 지형 생성 - 입자 퇴적
- 용암과 같이 끈적한 액체가 퍼져서 만들어진 지형을 흉내내는 입자 퇴적 소개.
- 산꼭대기가 움푹 들어간 칼데라(caldera) 지형 소개.
- 임의의 높이에 선을 긋고 그 이상의 값을 뒤집어서 표현.
저자
- Fractal Terrain Generation - Particle Deposition - Jason Shankel
5.0 2D 렌즈 플레어
- 광원 위치와 화면 중심을 잇는 선에 크기와 알파를 조절한 텍스쳐를 배열
- 그레이스케일 텍스쳐를 사용
저자
- 2D Lens Flare - Yossarian King
5.1 3D 하드웨어를 이용한 2D 스프라이트 효과
- DirectDraw::Blt()나 Win32::BitBlt() 대신 3D 공간 상에서 위치를 설정해 출력하자.
- 옛날 얘기
저자
- Using 3D Hardware for 2D Sprite Effects - Mason McCuskey
5.2 동기 기반 정적 조명
- RGB 성분만 실시간으로 바꿀 수 있는 정적 조명
- RGB animation
- 저자는 스위치 온/오프, 불꽃의 너울거림 등등 조명의 변화 방식을 동기(motif)라고 정의함.
저자
- Motif-Based Static Lighting - Steven Ranck
5.3 정점 색상 보간을 이용한 모의 실시간 조명
- 몇 개의 고정된 방향들에 대해 조명 정보를 미리 계산해두고, 보간해서 정점의 조명 값을 만들어서 사용
- FIFA 98에서 사용
저자
- Simulated Real-Time Lighting Using Vertex Color Interpolation - Jorge Freitas
5.4 감쇠 맵
- 감쇠 함수 계산을 직접하지 말고 미리 텍스쳐에 기록한 다음 샘플링해서 사용하자.
- 3D 텍스쳐 대신 2D, 1D 텍스쳐를 각각 1장씩 사용
- 감쇠 함수를 적절히 변형
- 두 텍스쳐에서 샘플링한 결과를 더하거나 곱해서 감쇠를 표현하기 위해
저자
- Attenuation Maps - D. Sim Dietrich Jr.
5.5 텍스처 좌표 생성을 이용한 고급 텍스처 기법
- 텍스쳐 애니메이션, 투영, 반사 매핑
저자
- Advanced Texturing Using Texture Coordinate Generation - Ryan Woodland
5.6 하드웨어 범프 매핑
tangent space, texture space 범프 매핑을 설명하고 문제점을 얘기함. 범프 매핑(노멀 매핑) 참고 자료. 간혹 둘이 같은 개념이라 설명하는 사이트도 있는데, 둘이 엄연히 다르다.
tangent space 범프 매핑
- 범프 맵이 적용되는 방식과 객체 표면 사이의 관계를 정의해야 함
- 암묵적으로 +Y 축을과 같이 한 축을 선택해서 접선 공간 행렬을 생성
- 이런 약속이 있어야 생성할 수 있다.
texture space 범프 매핑
- 아티스트가 표면에 실제로 텍스처를 입히는 방식을 반영
- 텍스쳐 x, y, z에 대한 s, t의 미분값으로 텍스쳐 space 기저를 만든다.
- S, T, S.cross(T)
- 뒤집힌 텍스쳐를 식별해 처리해줘야 한다.
- S.cross(T)와 폴리곤 노멀 벡터를 비교
저자
- Hardware Bump Mapping - D. Sim Dietrich Jr.
reference
5.7 기준 평면 그림자 효과
- 라이트 방향으로 평면에 오브젝트를 투영해서 그림자를 만드는 방법
- 요즘 기술은 #review 그림자 생성 – 니시카와 젠지 참고
저자
- Ground-Plane Shadows - Yossarian King
5.8 복잡한 객체에 대한 실시간적인 그림자 생성
- SSM으로 shadow texture를 그리고 projective texture mapping.
- #review 그림자 생성 – 니시카와 젠지 참고
저자
- Real-Time Shadows on Complex Objects - Gabor Nagy
5.9 광택성 사전 필터링과 프레넬 항을 이용한 개선된 환경 매핑 반사 효과
단순한 반사 모델에서 두가지를 개선하는 방법을 소개
광택성 사전 필터링 (glossy prefiltering)
- 모든 표면들이 빛을 완전하게 반사한다고 가정하는 걸 개선
- Phong BRDF를 사용해 환경맵을 적당히 흐릿하게 만든다.
프레넬(Fresnel) 항
- 표면 굴절률을 고려하지 않고 단순히 표면 노멀 백터만 사용하는 걸 개선
- 광선 입사각과 표면 굴절률을 이용해 적절한 가중치를 계산
저자
- Improving Environment-Mapped Reflection Using Glossy Prefiltering and the Fresnel Term - Anis Ahmad
5.10 게임을 위한 그럴듯한 유리 효과
- alpha 소팅 얘기
저자
- Convincing-Looking Glass for Games - Gabor Nagy
5.11 용기에 담긴 액체를 위한 굴절 매핑
-
프레넬(fresnell) 항을 사용
-
굴절률 항에는 스넬(snell) 법칙 사용
저자
- Refraction Mapping for Liquids in Containers - Alex Vlachos, Jason L. Mitchell