벡터 동차 계산
보통 1이면 포인터이다(0이 아니면 포인터), 0이면 벡터이다.
가장 마지막이 동차좌표계이다.
레스터화가 빠른 이유
레스터화가 빠른 이유를 설명하기 전에,
비교군인 레이트레이싱을 설명하겠습니다.
레이트레이싱
우리가 가장 많이 사용하는 알고리즘은 레이트레이싱 (역방향 알고리듬) 이다.
이 알고리듬은 시점에서 ray를 쏘고, 이 ray가 hit하게되면, 색을 결정한 다음에
hit point의 픽셀을 계산하여 렌더링하는 기술이다.
근데 모든 픽셀을 계산하려면 모든 픽셀에 광선을 쏘개된다.
만약 픽셀이 10만개면 최소 광선을 10만개는 쏴줘야한다.
레이트레이싱에서 가장 부담이 되는 것은 광선하고 물체가 충돌하는 부분을 계산해야 된다는 것입니다.
이러한 이론적인 것을 코드화하면
레이트레이싱은 다음과 같은 코드가 됩니다.
for(광선)
for(물체)
이는 만약 충돌체가 10개라면
하나의 광선에서 10개의 물체가 충돌하는 가? 하지 않는 가?를 모두 계산해야한다는 소리입니다.
그렇다면 위의 가정처럼 최소 10만개의 레이를 모두 10개의 물체를 체크한다면 연산량은 10배로 늘어나게 됩니다.
물론 자료구조나 알고리즘을 이용해서 레이트레이싱을 더 빠르게 만들 수 있지만,
레이트레이싱을 아무리 빠르게 만들어도 반사나 굴절같은 복잡한 자연 현상을 모두 실시간으로 연산하게 된다면
아무래도 꽤나 무거워질 것이다.
또한 픽셀을 가로 세로로 또 포문을 돈다면 광선에서 이미 이중 포문으로 돌아가게된다.
for(가로)
for(세로)
for(물체)
즉 이 이중포문 안에 다른 포문이 들어가게되면(= 충돌체 포문) 현저하게 연산 시간이 느려지게 된다.
래스터라이제이션(Rasterization)
래스터라이제이션에서는 3차원 공간에서 렌더링 할 때, 삼각형을 그려서 렌더링합니다.
일단 해당 포스팅에서는 기본적인 레스터라이제이션만 언급하고 모델링과 같은 과정은 생략할 예정입니다.
레스터라이제이션은 말 그대로 레스터화하기 좋습니다.
여기서 레스터화란, 삼각형 영역 안에 있는 것들만 따로따로 계산하기 좋은 방법을 말합니다.
즉 이는 어떠한 픽셀이 삼각형 안에만 들어 있는지 없는지를 판별하는 것이 우선입니다.
이를 코드화하면 다음과 같습니다.
for(물체)
for(픽셀)
즉 해당 픽셀의 정점만 알면 해당 물체 (삼각형)을 투영시켜주면 됩니다.
이처럼 앞서 말했듯이 필요한 부분만(삼각형 안에 픽셀이 있는 부분만 그리는 것)을 바운딩 박스라 합니다.
즉 레스터라이제이션이 더 빠른 이유는 위와 같은 연산량의 감소 때문입니다.
Edge Function
해당 삼각형( = 물체를 그리는 영역)을 구하는 함수로
α₂ = (V₂ - V₁) x (P - V₁) / 2
만약 α₂ < 0 이라면 벗어났다는 의미이다.
이 함수를 코드화 시키면 다음과 같다
const vec2 a = v1 - v0;
const vec2 b = point - v0;
return ( a.x * b.y - a.y * b.x ) * 0.5f;
해당 이론 적용된 결과물
이러한
삼각형을 꼭지점 -> 왼 -> 오 이면 시계방향
삼각형을 꼭지점 -> 오 -> 왼 이면 반시계방향
이라고 부른다.
(백페이스컬링과 연관있음)
++ PLUS ++
백스페이스 컬링이란?
그래픽스 파이프라인의 한 단계의 속하며 "컬링" 단계에서 이뤄진다.
컬링은 최종 씬에서 보이지 않은 불필요한 폴리곤을 잘라내 랜더링 및 연산에서 제외시키는 작업이다.
'그래픽스 > DX11' 카테고리의 다른 글
퐁라이팅 (0) | 2024.09.30 |
---|---|
DX11 - 무게중심좌표계 이론 (0) | 2024.09.24 |
DX11 - 빛의 반사 (0) | 2024.04.17 |
DX11 - 수퍼 샘플링 (0) | 2024.04.17 |
DX11 - 텍스춰링 (1) | 2024.04.03 |