7. 범프맵
물체의 울퉁불퉁함을 저장한 맵(텍스처)을 의미한다.
범프맵 종류
높이맵(Height Map)
노말맵(Normal Map)
8. 높이맵
2차원 그리드에 모델의 높이값을 저장한 텍스쳐이다.
높이맵을 범프맵으로 사용하면 노말맵으로 변환한 후 사용한다.
9. 높이맵의 색
높이맵은 단순히 높이값만 저장하므로 1채널만 사용한다.
보통 알파채널에 저장한다.
따라서 높이맵은 회색조(GRAY-SCALE)를 띤다.
10. 높이맵 -> 노말맵
높이맵을 노말맵으로 변환하는 방법은 아래 식과 같다.
D3DXComputeNormalMap() 함수를 사용하면 자동으로 계산해준다.
11. 노말맵
모델 표면에 수직인 노말 벡터를 저장해 놓은 텍스처이다.
벡터이므로 X, Y, Z를 이용하여 3채널에 저장한다.
노말맵의 노말벡터는 탄젠트 공간의 벡터이다.
12. 노말맵의 색
노말맵은 RGB 형태로 저장되는 데 벡터를 색으로 변환하므로 범위가 [-1, 1]에서 [0,
255]로 바뀌게 된다. 변환식은 아래와 같다.
이렇게 변환한 노말맵은 파란색을 띠는 데 그 이유는 뒤에서 설명한다.
13. 노말맵 제작
노말맵과 높이맵은 모델링 과정에서 생성한다.
저해상도 모델과 고해상도 모델을 만든 후, 저해상도 모델에 고해상도 모델을 덧씌운다.
저해상도 모델 표면의 노말 벡터 방향으로 반직선을 쏘아 해당 고해상도 모델과의 교
차점에서의 노말벡터를 노말맵에 저장한다.
38. 노말매핑의 한계
표면 노멀을 조금씩 변화시켜 착시 현상을 주지만 실제 표면의 높이를 바꾼건 아니다.
실제로는 오돌포돌한 앞면이 뒷면을 가려야 하지만 가리지 않고 시차(parallax)가 발생
하지 않는다.
노말매핑 하였지만 다소 입체감이 부족한 느낌이 든다.
39. 시차(PARALLAX)의 의미
시차는 관측 위치에 따라 물체들의 위치와 방향이 달라지는 현상을 말한다.
아래 예와같이, 시점을 달리해서 어떤 물체들이 보이는 지 알아보자.
시점 1 시점 2
A B
41. 시차(PARALLAX) : 시점 2
시점 2에서는 B의 크기가 물체 A를 가릴 만큼 크지 않아 두상자 모두 볼 수있다.
시점 2
A B
42. 노말 매핑의 시차 오류
노말 매핑의 경우 2차원 텍스처를 그저 매핑한 것이기 때문에, 시점 1에서도 물체 A,
B가 모두 보인다.
시점 1
객체 표면
매핑된 텍스처 매핑된 텍스처
A B
43. 패럴랙스 매핑의 정의
패럴랙스 매핑은 광선 추적법을 사용하여 시차 현상을 생성하는 방법을 말한다.
위치 a에 대한 텍스처 좌표
A B
위치 a 위치 b
위치 b에 대한 텍스처 좌표
44. 시차 현상 생성
기존의 노말 매핑은 빨간 직선을 향해 바라볼 때 위치 b에 대한 텍스처 좌표를 이용하여
노말맵에서 노말벡터와 텍스처에서 색상을 읽어왔다.
패럴랙스 매핑은 위치 a에 대한 텍스처 좌표를 가져와 노말벡터와 텍스처 색상을 구한다.
(해당 텍스처에 대한 가상의 높이값은 높이맵에 저장된다.)
위치 a에 대한 텍스처 좌표
A B
위치 a 위치 b
위치 b에 대한 텍스처 좌표
45. 알아두어야 할 것
가장 높은 위치는 텍스처가 매핑되는 객체 표면이다.
시선 벡터 V는 탄젠트 공간으로 변환한 벡터이다.
1.0
0.0
𝑻 𝟏: 기존 텍스처 좌표
𝑻 𝟐: 목표 텍스처 좌표
OpenGL
0.0
1.0
DX
객체 표면
𝑻 𝟏
𝑯(𝑻 𝟐)
𝑯(𝑻 𝟏)
Height Field
𝑽
𝑻 𝟐
46. 공식 유도
삼각형 닮음비를 이용하여 텍스처 좌표 𝑻 𝟐 에 대한 식이 다음과 같이 유도된다.
𝑻 𝟏: 기존 텍스처 좌표
𝑻 𝟐: 목표 텍스처 좌표
𝑻 𝟏
𝑽
𝑻 𝟐
𝑯(𝑻 𝟐)
𝑽 𝒙𝒚
𝑽 𝒛 𝑯(𝑻 𝟐): 𝑽 𝒛 = 𝑻 𝟐 − 𝑻 𝟏: 𝑽 𝒙𝒚
𝑻 𝟐 = 𝑻 𝟏 + 𝑯(𝑻 𝟐)
𝑽 𝒙𝒚
𝑽 𝒛
𝑻 𝟏
𝑯(𝑻 𝟐)
𝑯(𝑻 𝟏)
𝑽
𝑻 𝟐
47. 공식 유도
그러나 𝑻 𝟐의 높이값 𝑯(𝑻 𝟐)는 𝑻 𝟐를 몰라 구할 수 없다. 따라서 이 값을 대체할 수 있
는 근사값을 구하는 것이 패럴랙스 매핑 알고리즘의 핵심이다.
𝑯(𝑻 𝟐)의 근사값을 구하는 방식에 따라 다음과 같이 불린다.
Parallax mapping with offset limiting
Steep parallax mapping
Parallax occlusion mapping
𝑻 𝟐 = 𝑻 𝟏 + 𝑯(𝑻 𝟐)
𝑽 𝒙𝒚
𝑽 𝒛
48. PARALLAX MAPPING WITH OFFSET LIMITING
1.0
0.0
𝑻 𝟏: 기존 텍스처 좌표
𝑻 𝟐: 목표 텍스처 좌표
𝑻 𝒑: 오프셋 텍스처 좌표
𝑻 𝟏
𝑯(𝑻 𝟏)
Height Field
𝑽
𝑻 𝒑 Offset
𝑻 𝒑 = 𝑻 𝟏 + 𝒔 ∗ 𝑯(𝑻 𝟏)
𝑽 𝒙𝒚
𝑽 𝒛
𝒔 ∗ 𝑯(𝑻 𝟏)
𝑽 𝒙𝒚
𝑽 𝒛
𝑻 𝟐 = 𝑻 𝟏 + 𝑯(𝑻 𝟐)
𝑽 𝒙𝒚
𝑽 𝒛
에서 𝑻 𝟐를 모르기 때문에 𝑯(𝑻 𝟐)를 모른다.
따라서 𝑯(𝑻 𝟐) 대신 𝑯(𝑻 𝟏)에 적당한 스케일 값을 곱해 오프셋 시키는 방법이다.
52. STEEP PARALLAX MAPPING
P.M with O.L에서 오프셋을 높이를 기준으로 분할하여 해당 범위에 들어왔을 때 적
용하는 방법이다.
급경사에도 적용가능한 방법이다.
1.0
0.0
0.2
0.4
0.6
0.8
𝑻 𝟏
𝑽
𝑻 𝟒 𝑻 𝟑 𝑻 𝟐
Height Field
Layer
53. STEEP PARALLAX MAPPING
조건( 현재 높이값 > 현재 레이어 )을 만족하는 좌표가 나올 때까지 반복하여 오프
셋한다.
1.0
0.0
0.2
0.4
0.6
0.8
𝑻 𝟏
𝑽
𝑻 𝟒 𝑻 𝟑
Height Field
0.21 < 0.8
0.38 < 0.6
0.69 > 0.4
Layer
𝑻 𝟐
56. S.P.M 쉐이더 코드
다음 조건을 만족하지 않으면 루틴 종료
DX : 현재 레이어 > 현재 높이값, GL : 현재 레이어 < 현재 높이값
57. S.P.M 장단점
급경사진 구조도 적용이 가능하다.
다만 레이어 분할에 따른 부작용으로 엘리어싱
문제(계단 현상)가 발생한다.
58. PARALLAX OCCLUSION MAPPING
Steep Parallax Mapping에서 정확성을 더 높이기 위해 근접한 두 개의 텍스쳐 좌표
를 선형보간하는 방법이다.
1.0
0.0
0.2
0.4
0.6
0.8
𝑻 𝟏
𝑽
𝑻 𝟒 𝑻 𝟑
Height Field
Layer
𝑻 𝟐𝑻 𝒑
66. 변위 매핑
노말 매핑과 패럴랙스 매핑은 실제 폴리곤 구조 자체를 바꾸진 않는다.
변위 매핑은 높이맵을 이용해 모델의 위치를 변경하는 기법이다.
67. 쉐이더 모델5
쉐이더 모델 3 : 정점을 새로 만들지 못해 변위 매핑이 자체가 불가능하다.
쉐이더 모델 4 : GS가 추가 되어 변위 매핑이 가능하게 되었지만 느리다.
쉐이더 모델 5 : 마침내 테셀레이션 단계가 추가되어 변위 매핑을 구현할 수 있다.
68. 테셀레이션의 등장
테셀레이션은 그래픽 카드에 테셀레이터라는 장치가 포함되면서 부터 가능해졌다.
테셀레이션이란 주어진 기하구조를 더 작은 삼각형들로 분할하고, 새로 생긴 버텍
스들의 위치를 적절한 방법으로 조정하는 것을 말한다.
69. 테셀레이션의 등장
그래픽 파이프 라인에는 헐쉐이더, 테셀레이터, 도메인 쉐이더 추가되었다. 이 단
계에서 테셀레이션이 진행된다.
헐쉐이더와 도매인 쉐이더는 개발자가 각각 입력과 출력에 대한 제어할 수 있도록
프로그래밍이 가능하다.
Vertex Shader
Geometry Shader
Hull Shader Tessellator Domain Shader
RasterizerOutput Merger Pixel Shader
70. Hull Shader
HULL SHADER
Hull Shader는 테셀레이터에서 패치를 어떻게 쪼갤 지 설정하는 쉐이더이다.
Constant Hull Shader와 Control Point Hull Shader 두 개의 쉐이더로 구성된다.
Constant Hull
Shader
Control Point Hull
Shader
Vertex Shader Tessellator
71. CONSTANT HULL SHADER
Constant Hull Shader는 버텍스 쉐이더에서 제어점(Control Point)을 입력받아 테셀
레이션 계수(tessellation factor)를 출력하여 테셀레이터에 보낸다.
이 Shader는 패치 단위로 호출된다.
Hull Shader
Constant Hull
Shader
Control Point Hull
Shader
Vertex Shader Tessellator
tessellation factor
Control Points
72. 제어점(CONTROL POINT)
테셀레이션을 하는 경우, 버텍스 쉐이더의 출력은 버텍스가 아니라 제어점이다.
제어점은 패치의 버텍스들의 위치를 결정하는 역할을 한다.
제어점이 패치의 정점인 경우도 있으나 꼭 그런 것은 아니다.
Control point
73. 패치(PATCH)
버텍스 쉐이더에서 나온 제어점들은 패치 단위로 묶이게 된다.
여기서 패치는 테셀레이션 작업이 진행되는 최소 단위의 기하 구조를 의미한다.
패치 타입은 삼각형(tri), 사각형(quad), 선(isoline)중에 선택할 수 있다.
75. TESSELLATION FACTOR
패치에 대한 테셀레이션 계수는 다음 두 종류이다.
① 변 테셀레이션 계수(edge tessellation factor) : 변에 따른 세분 정도를 제어한다.
② 내부 테셀레이션 계수(interior tessellation factor) : 패치 내부의 세분 정도를 제어한다.
76. TESSELLATION FACTOR
패치에 대한 테셀레이션 계수는 다음 두 종류이다.
① 변 테셀레이션 계수(edge tessellation factor) : 변에 따른 세분 정도를 제어한다.
② 내부 테셀레이션 계수(interior tessellation factor) : 패치 내부의 세분 정도를 제어한다.
77. CONTROL POINT HULL SHADER
Control Point Hull Shader는 제어점을 수정하거나 추가하는 역할을 한다.
출력된 제어점들은 도매인 쉐이더로 보내진다.
Hull Shader
Constant Hull
Shader
Control Point Hull
Shader
Vertex Shader
Tessellator
tessellation factor
control points
Domain Shader
contorl points
tessellator mode
declation
78. CONTROL POINT HULL SHADER
또한 테셀레이터 세분 모드(integer, fractional_even, fractional_odd)를 지정한다.
Hull Shader
Constant Hull
Shader
Control Point Hull
Shader
Vertex Shader
Tessellator
tessellation factor
control points
Domain Shader
contorl points
tessellator mode
declation
79. TESSELLATION PARTITIONING
integer 모드는 테셀레이션 계수의 분수부를 무시하기 때문에 테셀레이션 수준이 변할
때 파핑 현상이 발생한다.
fractional_even, fractional_odd을 선택하면 파핑 현상 없이 매끄럽게 전이된다.
https://www.youtube.com/watch?time_continue=7&v=KXmV9o4VtOk
https://www.youtube.com/watch?time_continue=5&v=6sTI4yiAQEg
https://www.youtube.com/watch?time_continue=6&v=vtvvYEhRKcQ
80. PN TRIANGLES
제어점 헐 쉐이더에서 제어점을 추가하여 더 세분화된 테셀레이션을 하는 방식을
PN패치 방안(PN-patches scheme) 또는 PN 삼각형 방안(PN triangles scheme)이
라고 부른다.
컨트롤 포인트 3개 컨트롤 포인트 10개 테셀레이션
81. 테셀레이터
테셀레이터는 헐 쉐이더에서 설정한 것을 토대로 하드웨어가 테셀레이션한다.
도메인 쉐이더에 패치에 대한 매개변수 좌표를 보내고 Primitive Assembly에 기하
구조를 보낸다.
Hull Shader Tessellator Domain Shader
tessellation factor 매개변수 좌표(u,v)
tessellator mode
declation
기하구조(to primitive assembly)
control points + tessellation factor
82. DOMAIN SHADER
테셀레이터는 새로 생성된 삼각형 버텍스을 모두 출력한다.
도메인 쉐이더는 테셀레이터 단계가 출력한 각 버텍스마다 호출된다.
Hull Shader Tessellator Domain Shader
tessellation factor
control points + tessellation factor
매개변수 좌표(u,v)
tessellator mode
declation
기하구조(to primitive assembly)
버텍스
83. DOMAIN SHADER
도메인 쉐이더는 테셀레이션된 패치에 대한 버텍스 쉐이더 역할을 한다.
즉, 테셀레이션된 패치의 버텍스들을 동차 절단 공간(homogeneous clip space)으
로 변환한다.
Hull Shader Tessellator Domain Shader
tessellation factor
control points + tessellation factor
매개변수 좌표(u,v)
tessellator mode
declation
기하구조(to primitive assembly)
버텍스
84. DOMAIN SHADER
한가지 유의할것은 버텍스 위치의 매개변수화된 좌표(u,v)를 입력 받는다.
따라서 도메인 쉐이더에서 프로그래머가 이 uv좌표를 실제 3차원 버텍스 위치로 유
도하고 동차 절단 공간으로 변환한다.
도메인 쉐이더가 출력한 버텍스는 기하쉐이더 혹은 래스터라이저에 보내진다.
Hull Shader Tessellator Domain Shader
tessellation factor
control points + tessellation factor
매개변수 좌표(u,v)
tessellator mode
declation
기하구조(to primitive assembly)
버텍스
85. 사각형 패치와 삼각형 패치의 차이
사각형 패치의 경우, 도메인 쉐이더는 정점의 매개변수 좌표 (u,v)를 입력 받는다.
반면 삼각형 패치는 무게중심 좌표 (u, v, w)가 입력된다.
98. 변위 매핑 장점
테셀레이션은 고해상도 폴리곤 사용 시에 발생하는 느린 데이터 로드 문제를 피할
수 있다.
CPU
데이터 VRAM
GPU 렌더링
99. 변위 매핑 장점
고해상도 폴리곤을 사용하는 경우와 비교하였을 때, VS에서 저해상도 폴리곤에 대
한 월드변환만 하면 되므로 잘만 활용하면 필요한 연산이 줄어들 수 있다.
Vertex
Shader
Tessellation
월드 변환 변위 매핑 + 시야 투영 변환
Vertex
Shader
월드 변환 + 시야 투영 변환
(a) 고수준 폴리곤: VS에서 11개의 버텍스에 대해 월드 변환과 시야 투영 변환을 해야 한다.
(b) 저수준 폴리곤: VS에서 버텍스가 4개의 버텍스에 대해서만 월드 변환하면 된다.
111. 평면 방정식의 특징
평면 방정식을 통해 우리는 점의 위치를 알 수 있다. 점이 프러스텀 안에 있는 지 아
닌 지 알 수 잇다.
112. 프러스텀 컬링
평면 방정식의 a, b, c 성분은 노말 벡터의 x, y, z 값
을 의미하는데 노말 벡터의 방향은 모두 프러스텀
안쪽을 향한다.
따라서 모든 평면 방정식이 0보다 큰 경우에 버텍스
는 프러스텀 내에 존재한다는 것을 알 수 있다. 이
특성을 이용하여 컬링을 진행한다.
115. ADAPTIVE TESSELLATION TECHNIQUES
테셀레이션을 최적화 시키기 위해 HS에서 할 수 있는 Adaptive tessellation 기법들
이 있다.
Distance Adaptive Tessellation
Density Adaptive Tessellation
Screen Space Adaptive Tessellation
119. DENSITY ADAPTIVE TESSELLATION
높이맵을 이용하여 테셀레이션 계수를 미리 계산하는 방법이다.
테셀레이션 계수를 저장한 맵을 밀도맵(Density map)이라 한다.
고주파수 영역은 촘촘하게 저주파수 영역은 듬성듬성하게 테셀레이션이 된다.
120. DENSITY MAP 생성
현재 픽셀과 현재 픽셀을 둘러싸고 있는 픽셀들의 높이값을 가지고 밀도값을 계산한다.
Height Map
수평 변화량 = (𝐻 𝑅−𝐻 𝐶) − (𝐻 𝐶−𝐻𝐿)
𝐻 𝐶 𝐻 𝑅𝐻𝐿
𝐻 𝑇𝐿 𝐻 𝑇 𝐻 𝑇𝑅
𝐻 𝐵 𝐻 𝐵𝑅𝐻 𝐵𝐿
수직 변화량 = (𝐻 𝐵−𝐻 𝐶) − (𝐻 𝐶−𝐻 𝑇)
대각선 변화량(1) = (𝐻 𝑇𝑅−𝐻 𝐶) − (𝐻 𝐶−𝐻 𝐵𝐿)
대각선 변화량(2) = (𝐻 𝐵𝑅−𝐻 𝐶) − (𝐻 𝐶−𝐻 𝑇𝐿)
If(수평 변화량 >= 임계값) density += a * 수평 변화량
If(수직 변화량 >= 임계값) density += a * 수직 변화량
If(대각선 변화량(1) >= 임계값) density += b * 대각선 변화량(1)
If(대각선 변화량(2) >= 임계값) density += b * 대각선 변화량(2)
a와 b: 프로그래머가 조정가능한 상수
121. 소스코드
CPU 영역에서 밀도맵을 한다.
매개변수 fDensityScale에 밀도의 스케일 값, fMeaningfulDifference는 임계값을 의
미한다.