3D영상 출력, 모델링과 렌더링 그리고 CPU와 그래픽카드
여러가지 3D영상을 접하고 만들다보면 기본적인 원리에 대해 궁금해질때가 있다.
그래서 한번 이야기해볼까한다.
3D영상을 생성하고 그걸 우리가 쓰는 모니터로 출력하기 위해선 모델링과 렌더링이란 작업을 거쳐야한다.
모델링이란 뭘까,
3차원 공간에 물체의 모양, 크기, 위치, 표면 특성 등
물체의 고유값을 설정하거나 수정하는 단계를 바로 모델링이라고 한다.
그중 가장 중요하다고 생각되는건
모양과 크기인데.
이 2가지를 설정할땐 주로 3개의 점으로 만들어지는 삼각형을 활용한다.
(요즘은 사각형도 많이 쓰지만 전통적으로 삼각형을 많이 써왔다)
작은 삼각형들로 이루어진 그물같은 형태로
물체 표면을 표현하는 방식인데.
굴곡있고 아주 복잡한 표면도
여러개의 작은 삼각형들로 표현이 가능하다.
이때 삼각형의 꼭지점들은 물체의 모양과 크기를 결정하는
각각의 점이 되는데.
이 각각의 점들의 개수는 물체가 변형되어도 변하지 않고.
상대적 위치는 물체의 모양이 변하지 않는 한 달라지지도 않는다.
물체가 커지거나 작아지는 경우,
점과 점 사이가 넓어지거나 좁아지고
물체가 회전하거나 이동하는 경우,
점들이 간격을 유지하면서
회전축을 중심으로 회전하거나
물체가 이동한 방향으로 이동한 만큼
똑같이 움직인다.
물체 표면을 구성하는 각 삼각형 면에는
고유의 색과 질감 등을 나타내는
표면적 특성이 하나씩 주어지게 된다.
이걸 모델링이라고 한다.
이렇게 모델링을 통해 정리된 정보를 활용해서
원하는 시점을 기준으로
새롭게 2차원 공간에 만들어내는게
바로 렌더링이다.
전체 화면을 잘게 나눈 점이 화소(픽셀)라고 하는데.
각 픽셀별로 밝기나 색상 등을 나타내는 픽셀값이 부여된다.
원근감도 멀리있거나 가까이 있는 걸 기준으로 각각 값을 정해줌으로
표현해낼 수 있다.
원근감 같은 요소 말고도
표면의 특성을 나타내는 값을 바탕으로
가려졌다거나 조명으로 달라지는 명암, 만들어진 그림자 등을 고려해서
값을 정해주면 이걸로 물체의 입체감을 구현해낼 수도 있다.
이렇게 화면을 구성하는 모든 픽셀값이 정해지면 그게 바로 하나의 프레임이 된다.
이게 모니터에 띄워지면 마치 사진처럼
멈춰있는 그림으로 표현된다.
이런 과정을 반복해서 만들어낸 프레임들을 순서대로 나열하면 바로 동영상이 된다.
프레임을 만들 때 모델링값들을 계산 완료한 다음
그 결과값을 렌더링해주기 위해 넣어주고 계산하게되는데.
이때 삼각형을 구성하고 있는 점의 개수가 많을 수록
해상도가 높아지고
그 높은 해상도에 주사하려는 출력 화소의 수가 많을 수록
연산 양이 많아져 연산 시간이 길어진다.
컴퓨터 CPU는 데이터 연산을 순서대로 하나씩 처리하기에
과도한 양의 데이터가 주어지면
차례대로 처리하다보니
기다리는 데이터가 생기게되고.
이걸 병목현상이라고 한다.
이런 CPU 병목현상이 생기면 프레임이 완성되는데 시간이 오래걸리게된다.
이걸 보안하기 위해 나온게? 그래픽카드다(GPU)
그래픽카드는 연산을 비롯한 데이터 처리를
독립적으로 수행할 수 있는 장치인 코어를 겁나게 많이 달고있다.
수천개에서 몇만개까지 달고있다.
최근 공개된 rtx3080ti 는 쿠다 코어 1만 240개를 달고있다.
그래픽카드의 코어는 그래픽 연산에 특화된 연산만!을 할 수 있고
CPU코어보다는 속도가 느리다.
대신 동일한 연산을 여러번 해야하는 경우,
그래픽카드는 연산에 쓰일 데이터들을 각각의 코어에 보내놓고
전체 코어에 하나의 연산 명령만 전달해주면
동시에 연산이 진행됨으로
연산시간이 짧아진다.
이걸 아주 활용한게 바로
코인 채굴.
엄청난 수의 코어로 단순 계산을 진행한다.
여기까지가
3D영상 출력에 필요한 모델링과 렌더링 그리고 CPU와 GPU 이야기였다.
사람들이 많이 찾아본 글