목록공부하는거/컴퓨터 그래픽스 (5)
김서버의 프론트엔드 일기
정점쉐이더 -> 래스터라이저 -> 프레그먼트 쉐이더 -> 출력 병합기 -> 출력 gpu 렌더링 파이프라인에서 정점처리를 마무리 되고 나면, 그 다음 래스터라이저 단계를 진행된다. 래스터라이저는 프로그래머가 코딩을 하는 부분이 없고, GPU에서 알아서 처리하기 때문에 프로그래머가 신경을 써줄만한 요소는 잘 없다. 하지만 정점쉐이더(vertex shader) 프로그래밍 이후에 어떻게 처리가 되어, 우리가 코딩해야하는 프레그먼트 쉐이더(fragment shader)까지 도달하는지 알아볼 필요는 있다. 래스터라이저 개요 정점쉐이더가 출력한 정점들은 프리미티브라는 개체로 다시 조립이 된다. 이 프리미티브는 스크린에 그려질 형태로 변환된 후 프래그먼트로 분해되는데 이를 래스터화라고 부른다. 프래그먼트는 컬러 버퍼의..
GPU는 폴리곤메시를 입력 받아, 3차원의 폴리곤 메시를 2차원 형태로 바꾸고, 2차원 폴리곤 내부를 차지하는 픽셀들의 색상을 결정한다. 이 픽셀들은 컬러 버퍼에 기록되고, 주기적으로 스크린으로 복사된다. GPU의 렌더링은 파이프라인으로 구조로 구현되며, 그 순서는 다음과 같다. 정점쉐이더 -> 래스터라이저 -> 프레그먼트 쉐이더 -> 출력 병합기 -> 출력 여기서 쉐이더는 프로그래머가 프로그래밍 할 수 있는 부분이다. GPU를 렌더링 하기 위해서는 정점쉐이더와 프래그먼트 쉐이더 프로그램을 작성하면, 래스터라이저 출력 병합기는 하드웨어 단계에서 정해진 연산을 수행한다. 정점 쉐이더는 정점배열에 저장 된 모든 정점에 대해서 변환을 비롯한 다양한 연산을 수행한다. 래스터라이저는 삼각형들을 조립한 후, 각 삼..
컴퓨터 세상에는 다양한 물체들로 구성되어 있는데, 각 물체는 이동, 회전, 축소확대가 될 수 있으며, 이러한 행위들을 총칭하여 변환이라고 한다. 축소확대 2차원에서는 2 X 2 행렬로 표현된다. Sx 0 0 Sy 여기서 Sx와 Sy는 각각 x축과 y축 방향의 축소확대 인자이다. 이 인자가 1보다 크면 확대를, 작으면 축소를 의미한다. 2차원 벡터 (x,y)는 행렬-벡터 곱셈을 통해 축소 확대 된다. Sx 0 X x = Sx * x 0 Sy y Sy * y 회전 마찬가지로 2차원에서는 2 X 2행렬로 표현되며, 회전을 하기 위한 행렬식은 각도 O를 받았을 때, 다음과 같이 구성된다. Math.cos(O) -(Math.sin(O)) Math.sin(O) Math.cos(O) 위 행렬과 2차원 벡터 (x,y)..
3차원 물체를 표현하는 다양한 기법이 존재하지만, 실시간 그래픽스 영역에서는 폴리곤 메시를 압도적으로 많이 사용한다. 폴리곤 메시가 어떻게 생성되고, 저장이 되고 게임과 같은 런타임 응용프로그램으로 어떻게 전달이 되는지 알아보자 1. 폴리곤 메시 폴리곤 메시는 부드러운 곡면을 근사적으로 표현한 것이다. 따라서 "얼만큼 정점을 많이 사용하여 근사하게 할 것인 가" 라는 고민은 용량과도 연결 되어 있으며, 이는 성능이슈와도 연결이 된다. 정점의 갯수가 많으면 해상도가 높다고 말하며, 적으면 해상도가 낮다고 표현한다. 폴리곤 메시는 정점, 변, 면 으로 구성되며, 각종 3D 툴에서는 이런 면을 조작할 수 있는 기능들이 있다. 폴리곤 메시 표현 폴리곤 메시를 표현하는 가장 단순한 방법은 세 개의 정점을 순서대로..
3D나 컴퓨터 그래픽스 하면 엄청 어려운 수학을 해야한다고 생각이 될 것 인데, 우선 적어도 이번 요점 정리하는 컴퓨터그래픽스 기초 부분에서는 그렇게 어려운 수학이 필요없다. 하나씩 알아보자 행렬과 벡터 숫자들이 행과 열로 구성이 되어있는데, 프로그래밍을 공부한 사람들이라면 이미 배열이라는 이름으로 그 개념을 알게모르게 몸에 익혀있을 것이라고 가정하고 적어본다. a11 a12 a13 a21 a22 a23 a31 a32 a33 이와 같이 행과 열의 크기가 같으면 정사각행렬이라 한다. 행렬의 곱 두 행렬 A 와 B에서 A의 크기가 l x m 이고 B의 크기가 m x n 이면, A와 B의 곱의 크기는 l x n이 된다. a11 a12 b11 b12 b13 a21 a22 x b21 b22 b23 a31 a32 ..