Computer Science

3D computer graphics introduction | CrashCourse

토마토. 2021. 9. 18. 16:07

참고

https://www.youtube.com/watch?v=TEAtmCYYKZA 

 

 

 


index

기본 개념

3D projection

 

 

Wireframe rendering

orthographic projection

 perspective projection

 

scanline rendering

anti-aliasing

painter's algorithm

 

z-buffering(?)

back-face culling

 

flat shading

gouraund shading

phong shading

texture mapping

 

GPU


3D projection

3D 공간에서 점은 3개의 좌표를 갖는다.

(x,y,z)

그래픽 알고리즘은

3차원 좌표를 2차원 화면에 '평평하게' 만들어 표현해야 한다.

 

 

 rendering

2차원 화면에 3차원 화상을 표현하는 과정

 

Wireframe rendering

물체의 모서리를 그려주는 가장 간단한 랜더링 방식

3차원에서 2차원으로 모든 점을 변환하면, 일반적인 2D 선 그리기 기능으로 점들을 연결할 수 있다.

ex) 정육면체에 손전등을 비추어 그림자가 생기는 것

 

 

cf) https://en.wikipedia.org/wiki/Wire-frame_model

 

A wire-frame model, also wireframe model,

is a visual representation of a three-dimensional (3D) physical object

used in 3D computer graphics

 

It is created by specifying each edge of the physical object

where two mathematically continuous smooth surfaces meet,

or by connecting an object's constituent vertices using (straight) lines or curves

 

The object is projected into screen space and rendered by drawing lines at the location of each edge

 

orthographic projection

기벡...??

정사영

큐브의 평행한 변이 투영에서 평행하게 나타난다.

 

 perspective projection

실제로는, 관찰자에서 멀어질수록 한 점에 수렴한다.

이것까지 반영한 것이 perspective projection

같은 과정이지만 다른 수학을 사용함.

직서능로 쉽게 사용한다.

 

출처 : https://notyu.tistory.com/39

좌 : 정사영 / 우 : perspective projection

 

 

polygons

3D 그래픽의 기본 단위

폴리곤이라고 불리는 삼각형들을 사용한다.

CrashCourse - 3D graphics

 

폴리곤의 무리들을 Mesh라고 한다.

 

Mesh의 밀도가 높을수록, 곡선이 매끄러워지고, 디테일은 세밀해진다.

but 컴퓨터 부하가 심해짐.

 

모형 충실도와 폴리곤 갯수 사이에서 균형을 맞춰야 한다.

애니메이션 프레임속도가 떨어지기 때문에

메쉬 단순화 알고리즘이 존재한다.

 

삼각형이 사용된 이유는 단순하기 때문이다.

평면을 그릴 수 있다.

평면을 정의하는데 3개가 최솟값이다.

 

mesh 단순화 알고리즘

 

scanline rendering

하나의 폴리곤이 주어졌을 때 컴퓨터는 어떻게 픽셀로 변환하는가?

출처 : https://www.nicepng.com/ourpic/u2q8y3w7y3r5t4i1_a-scanline-example-software-rendering-algorithms/

 

 

step 1. 폴리곤 위에 픽셀 격자를 겹쳐보이도록 한다.

 

step 2. 폴리곤 y좌표들의 최댓값과 최솟값을 찾는다.

 

step 3. 최댓값~최솟값 범위 줄(행)을 하나씩 처리한다.

-> 행을 통과하는 선이 폴리곤의 선분과 교차하는 위치를 계산한다.

-> 두 교차점을 구해 사이의 픽셀을 채운다.

 

step 4. 최솟값에 도달하면 끝!

 

 

* fill rate *

= 폴리곤을 채우는 속도

 

but, scanline rendering은

계단현상 jaggies를 가지고 있다.

작은 픽셀을 사용하면, 저전력 플랫폼에서 이런 현상이 나타난다.

- ex -

출처 : https://en.wikipedia.org/wiki/Jaggies

 

anti-aliasing

 

 

 

anti-aliasing 알고리즘은

폴리곤을 같은 색으로 채우는 대신에

각각의 픽셀을 얼마나 잘랐는지에 따라 색상을 조정한다.

 

- 픽셀이 폴리곤 완전히 안쪽에 있는 경우 -> 같은 색 사용

- 픽셀이 폴리곤의 경계에 걸쳐있는 경우 -> 살짝 밝은 음영 사용

 

가장자리 페더링이 눈에 보기 좋다.

 

2D 그래픽, 글꼴, 아이콘 등에 사용함.

 

occlusion

어떤 물체는 다른 물체 뒤에 감추어져 있다.

겹쳐진 물체를 감추는 것을 'occlusion' (폐색)이라고 한다.

처리하는 알고리즘이 여러 가지 있음.

 

painter's algorithm

 

(거리를 기준으로) 정렬 알고리즘을 사용한다.

가장 먼 곳부터 가장 가까운 곳까지

순서대로 렌더링해서 정렬한다.

 

화가가 작업하듯이(?)

배경에서 시작해서 전경 요소까지 나아가며 작업한다.

세 개의 폴리곤이 겹치는 예제 장면이 있다.

 

step 1 > step 2 > step 3

거리 순으로 픽셀을 채운다.

https://ko.wikipedia.org/wiki/%ED%99%94%EA%B0%80_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

 

z-buffering

https://ko.wikipedia.org/wiki/Z_%EB%B2%84%ED%8D%BC%EB%A7%81

 

어떤 물체가 그려질 때 만들어진 픽셀의 깊이 정보(z 좌표)는 버퍼(Z 버퍼 혹은 깊이 버퍼)에 저장된다.

이 버퍼는 (x-y)의 2차원 좌표를 기준으로 해당하는 각각의 스크린 픽셀 요소들로 정렬되어 있다.

만약 다른 물체가 같은 픽셀에 그려져야 할 때,

Z 버퍼링은 현재 픽셀과 새로 그려질 픽셀 중 어떤 것이 관찰자에게 더 가까운지 깊이를 비교한다.

Z 버퍼에 기록되도록 새로 선택된 깊이는 이전의 깊이를 덮어쓴다.

즉, Z 버퍼는 더 '가까운 물체가 더 먼 물체를 가린다' 라는 직관적 깊이 관념을 정확하게 따를 수 있게 돕는다.

이 방식을 Z 컬링이라고 부른다.

https://www.youtube.com/watch?v=TsjYPu7piY0

더보기

폐색을 다루는 또 다른 방법은 Z-buffering??

이전과 같은 결과를 출력하지만 아까와는 다른 알고리즘이다.

모든 픽셀에 대해 폴리곤까지 가장 가까운 거리를 추적한다. ?

메모리 값을 나타내는 행렬인 z-버퍼를 유지함으로써 이 작업을 수행한다.

모든 픽셀을 초기화한다.

첫번째 폴리곤으로 시작하는데, 이 경우네느 A이다.

픽셀 단위로 색상을 지정하는 대신,

폴리곤의 거리와, Z-버퍼 안에 기록된 거리를 사용한다.

거리가 폴리곤 A가 무한대에 대항하여 이긴다.

 

폴리곤 C의 경우에는

Z-버퍼의 값 중에 일부만 최소 거리를 갖는다.

스캔라인 렌더링의 멋진 버전과 사용하여

라인 교차점을 테스트하고

픽셀이 최종 장면에서 보이는지 확인하기 위한 룩업도 한다.

만약 보이지 않는다면, 다음으로 진행한다.

폴리곤이 같은 거리에 있는 경우에는??

 

A=B 둘다 20이라면, 어느 것이 위에 올라와야 할까?

끊임없이 메모리 안에서 섞인다.

반올림 오류는 부동 소수점 연산에 내재되어 있다.

그래서 어느 것이 위에 그려지는지 예측하기 어렵다.

Z-fighting : 깜빡이는 현상 / 3D 게임에서 나타나는 현상이다.

 

 

최적화 알고리즘

일반적인 최적화는

back-face culling

삼각형은 앞 뒤로 두 면을 가지고 있다.

아바타 머리 또는 게임 속의 백그라운드는 한 면만 볼 수 있따.

바깥을 향한 쪽이다.

처리 시간을 절약하기 위해

폴리곤의 뒷면은 랜더링 파이프라인에서 제거한다.

 

객체 속으로 들어가게 하는 버그가 있을 때만 제외하고 괜찮은 것이다.

아 이거 알지..

 

shading - 조명 처리

flat shading

shading - 조명

3D에서 조명은 물체의 표면에 따라 달라져야 한다.

주전자 메쉬로 돌아가보자.

모든 폴리곤에서 스캔라인 랜더링 색칠을 하면??

조명을 추가해서 현실성을 높여야 한다.

3곳의 다른 부분을 선택하게 된다.

3D 공간에서 어떻게 방향을 잡을 것인가?

화면에 평행이 아니고, 다른 3D방향으로 기울어져 있다.

 

표면 법선  :  surface normal

폴리곤 표면에 수직인 3D 화살표로 방향을 시각화할 수 있다.

 

광원을

CrashCourse - surface normal

광원에 의해 각 폴리곤은

다른 양으로 조명되어 일부는 더 밝게 나타날 것이다.

보는 사람쪽으로 더 많은 빛이 반사되도록 한다.

광원에서 멀리 떨어져 아래쪽으로 기울어져 있다.

어두운 색이 될 것이다.

오른쪽 폴리곤은 빛을 향하고 있으므로, 부분적으로 조명될 것이다.

폴리곤마다 평면이 있고, 그 나름대로 기울어져있다. (화면을 기준으로)

모든 다각형에 대해 처리하면, 주전자가 현실적으로 보일 것이다.

 

flat shading = 기본적인 조명 알고리즘이다.

 

모든 경계들이 눈에 띄도록 만들고, 매쉬가 부드럽게 보이지는 않는다.

-> gouraund shading / phong shading같은 조명 알고리즘이 개발되었다.

하나의 색상으로 하는 대신,

표면의 색상을 영리한 방법으로 변화시킬 수 있다.

 

그외에도..

gouraund shading

phong shading

 

texture mapping

텍스쳐 texture : 표면의 표정

texture mapping

스캔라인 랜더링에서 메모리에 저장된 텍스쳐 이미지에 따라 모든 픽셀에서 사용할 색상을 찾을 수 있다.

폴리곤의 좌표와 텍스쳐의 좌표 사이의 매핑이 필요하다.

스캔라인 렌더링이 채워야하는 픽셀에서는 메모리에서 텍스쳐를 참고하여

해당 영역의 평균색에 따라 폴리곤을 채운다.

이 과정은 폴리곤 안에 있는 모든 픽셀에서 반복한다.

 

이를 통해 택스쳐를 얻을 수 있다.

 

최적화

수백만개의 폴리곤으로 구성된 훨씬 더 많은 장면에

랜더링에는 상당한 계산량이 요구된다.

그러나, 동일한 유형의 연산이 반복적으로 수행된다.

스캔라인 채우기, 안티앨리어싱, 조명, 텍스쳐링 같은 연산

 

어떻게 하면, 더 빠르게 만들 수 있는가?

GPU

GPU = 그래픽 전용 프로세서 graphics processing unit :

그래픽 카드 내부에 있다.

그래픽을 위한 램이 예약되어 있다.

매시와 택스쳐가 있는 곳이고, 매우 빠르게 엑세스할 수 있다.

GeForce GTX 1080 TI 최신 그래픽 카드 = 처리 코어가 많다.

 

병렬 처리

 

순차적으로 하기보다는, 병렬로 랜더링하기

cpu는 빠르지 않다.