그래픽스/공통

    NDC (Clip Space)란 무엇인가?

    렌더 파이프 라인에서 Vertex Shader 단계의 마지막에, 지정된 좌표를 받아들이고 이 범위에서 벗어난 모든 좌표는 자르게된다. 이때, Clip 된 좌표들은 모두 폐기되고, 남은 좌표들은 최종적으로 파편화되어 화면에 보이게 되고 눈에 보이는 모든 좌표들이 -1.0과 1.0 범위 안에 지정하는 것은 직관적이지 않기 때문에, 우리가 원하는 화면에 표현하기 위한 공간으로 다시 변환하게 된다. 이때 사용되는 것이 NDC(Noramlize Device Coordinate)이며, 이 공간은 투영(Projection) 행렬에 정의된다. 앞서 유도한 투영 행렬이 정의하는 Viewing Box는 절두체(Frustrum)라고 불린다. 이 절두체 내부에 있는 좌표들은 화면에 나타나게 된다. 지정한 범위 내에서 NDC로..

    레스터화기 단계 Rasterization

    레스터화 단계 (rasterization stage)라고도 하는 레스터화기 단계 (rasterizer stage)의 주 임무는 투영된 3차원 삼각형으로부터 픽셀 색상들을 계산해내는 것이다.1. 뷰포트 변환절단을 마치고 나면 하드웨어는 원근 나누기를 수행해서 동차 절단 공간 좌표를 정규화된 정규화된 좌표 (NDC)로 변환한다.정점들들이 NDC 공간으로 들어왔다면, 2차원 이미지를 형성하는 2차원 x,y 좌표 성분들을 후면 버퍼의 한 직사각형 영역으로 변환한다. 그 직사각형 영역이 바로 뷰포트 이다. 이 변환을 마치고 나면 x,y 성분은 픽셀 단위의 값이 된다. 일반적으로 이 뷰포트 변환은 z 성분을 변경하지 않는다. (그 성분은 깊이 버퍼링에 사용해야 하므로) 그러나 D3D11_VIEWPORT 구조체의 M..

    드로우콜 (Draw Call)

    CPU는 현재 프레임에 어떤 것을 그려야 할지 정하고, GPU에 오브젝트를 그리라고 명령을 호출하는 명령이다. 게임의 오브젝트를 화면에 렌더링하려면 우선 오브젝트가 렌더링 대상인지를 판단한다. 이러한 과정을 컬링이라고 한다. 컬링을 거친 오브젝트가 렌더링 되기 위해선 CPU에서 GPU에 다음의 정보를 줘야 한다. 메시 정보 텍스처 정보 쉐이더 정보 트랜스폼 정보 알파 블렌딩 여부 기타 등등 메시 텍스쳐 쉐이더등의 정보는 스토리지에 보관되어 있다가 CPU가 이를 읽어들여 CPU 메모리에 데이터를 올린다. 그 후 CPU메모리에 있는 정보들을 GPU 메모리로 복사한다. 정보들은 GPU 메모리에 있어야 GPU가 사용할 수 있다. 만약 위 복사과정이 매 프레임마다 일어난다면 성능을 많이 잡아먹을 것이다. 따라서 ..

    배칭 (Batching)

    배칭은 여러 배치를 묶어 하나의 배치를 만드는 것이다. 드로우콜 횟수를 줄이는 가장 효과적인 방법 중 하나이기도 하다. 배칭을 위해서는 오브젝트들이 동일한 머티리얼을 사용해야 하는데, 이때 머티리얼이 동일하다는 것은 동일한 머티리얼 인스턴스가 같다는 것을 의미한다. 스태틱 배칭 스태틱 배칭은 정적인 오브젝트를 대상으로 하는 배칭 기법이다. 따라서 런타임에서 버텍스 연산을 하지 않아도 되기 때문에 매우 효율적이다. 스태틱 배칭은 메시의 폴리곤 수에 상관 없이 같은 머티리얼을 사용하는 오브젝트들을 하나의 메시로 묶어준다. 단, 머티리얼이 1개라고 해서 무조건 1개의 배치로 합쳐지는 것은 아니며 라이트와 같은 요소들로 인해 배칭이 나뉠 수 있다. 합쳐진 메시를 생성해야 하기 때문에 추가적인 메모리가 필요하다...

    병목 (Bottleneck)

    최적화 게임의 성능 최적화를 위해서는 다음의 작업들을 고려할 수 있다. 메시의 버텍스 줄이기 텍스처 크기 줄이기 가벼운 쉐이더 사용 드로우콜 줄이기 게임 로직 최적화 물리 연산 줄이기 기타 등등 그러나 위 작업들을 수행하기 전에 어디서 병목이 일어나는지를 알아야 한다. 왜냐면 병목이 일어나는 곳 외에서 최적화를 해봤자 전반적인 수행 속도는 크게 바뀌지 않기 때문이다. 목표 설정 게임의 최적화 목표를 설정할 때 60FPS냐 30FPS냐를 정하는 것을 목표로 삼을 수 있다. 그러나 먼저 기준이 되는 하드웨어 스펙을 정해야 한다. 예를 들어 만드는 게임이 퍼즐게임이라면 가능한 다양한 기기에서 이용 가능하도록 해야 할 것이다. 또한 더 좋은 디바이스라고 해서 병목이 덜 발생할 것이라고 생각할 수 있지만 사실은 ..

    곡선 (Curve) & 스플라인 (Spline)

    곡선을 표현하기에 앞서, 두 정점 (A, B) 사이에 있는 점 P를 다음과 같이 표현할 수 있다. 또한 곡선은 t에 대한 방정식(P(t))으로 표현할 수 있다. 베지에 곡선(Bézier Curves) n차 베지에 곡선은 n+1개의 점으로 얻을 수 있는 베지에 곡선이다. 1차(Linear) 베지에 곡선은 앞서 말한 점 A,B 사이에 있는 점 P의 집합으로 표현할 수 있다. 말이 곡선이지, 사실상 A-B를 잇는 선분이다. 2차(Quadratic) 베지에 곡선은 아래와 같다. 2차 베지에 곡선은 A와 B를 잇는 1차 베지에 곡선 위에 있는 한 점 AB(t)와 B와 C를 잇는 1차 베지에 곡선 위의 한 점 BC(t)사이에 있는 한 점 P(t)의 집합으로 볼 수 있다. 식으로 표현하면 다음과 같다 이때 두 선분 ..

    Ambient and Diffuse Lighting / 환경 및 반사되는 광원

    보통은 물체마다 '고유한'색이 있다고 생각한다. 하지만 엄밀히 물체는 광원으로부터 빛을 반사할 뿐이고 그 반사된 빛이 적색계열에 민감한 L형, 녹색계열에 민감한 M형, 청색계열에 민감한 S형 원추세포들의 반응에 따라 색을 구분한다. 그래서 광원의 세기, 색 등에 따라 물체의 색은 달라질수있다. 컴퓨터에서도 원추세포들처럼 R, G, B값들의 조합에 따라 색을 표현한다. 빛을 컴퓨터상에서 표현할때 주로 rasterization과 ray tracing방식을 쓴다. ray tracing방식은 계산비용이 커서 게임과 같은 실시간 렌더링에서는 쓰지 않는다. (하드웨어의 발전으로 요새는 차차 쓰인다고 한다.) 그래서 rasterization방식을 이용하여 빛을 그리고 색을 표현해볼 것이다. 빛의 종류 빛은 크게 3가..

    드로우 콜과 배칭 개념 간단 정리

    1. CPU와 GPU의 상호작용 CPU에서 GPU에 명령하기 일반적으로 CPU에서 렌더링, 상태 변경 등의 명령을 GPU에 전달한다. 그런데 GPU가 바쁘게 작업하는 도중이라면, CPU는 GPU의 작업이 끝나기를 하염없이 기다리게 될 수 있다. 따라서 커맨드 패턴(Command Pattern)과 메시지 큐(Message Queue)에 의한 비동기 방식을 활용한다. CPU에서 GPU에 전달할 명령(Command)을 임시 공간에 담아 두고, GPU가 여유 될 때 명령을 하나씩 꺼내어 처리한다. Command Buffer(커맨드 버퍼) CPU의 각 스레드에서는 GPU에 전달할 렌더링 관련 명령을 모듈화하여 커맨드 버퍼에 차곡차곡 쌓아 임시로 저장한다. 그리고 GPU의 공유 커맨드 큐에 전송한 뒤, GPU를 기..

    그래픽스 파이프라인 (게임 엔진 관점)

    3D 그래픽을 사용하는 게임들이 포함하고 있는 모듈들. - 사용자 입력(User Input) - 자원 관리(Resource Management) - 그래픽 로딩과 렌더링(Loading and Rendering Graphics) - 스크립트 해석과 실행(Interpreting and Executing Scripts) - 음향 처리(Playing Sound Effects) - 인공 지능(Artificial Intelligence) 위의 소스 코드 모듈은 집합적으로 게임 엔진(Game Engine)을 구성한다. 게임 엔진의 구성 객체의 표현과 렌더링 렌더링(Rendering)이란 3D 게임 세계의 객체들을 컴퓨터의 화면(2D)으로 그리는 것, 또는 그리는 과정이다. 메시(Mesh)는 게임 공간 또는 게임 세계..

    셰이더란? (Shader)

    렌더링 파이프라인 그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 조작할 수 있는 프로그래밍 언어이다. 렌더링 파이프라인은 크게 Fixed Pipeline과 Programmable Pipeline이 존재하는에 이중에 Shader가 반영화된 파이프라인이 Programmable Pipeline이다. 렌더링 파이프라인의 최종 목표는 컴퓨터 데이터를 모니터의 픽셀까지 뽑아내기 위한 것이다. 해당 파이프라인 안에서 데이터를 조작 할 수 있다. Shader는 크게 두 가지가 존재한다. Vertex Shader : 버텍스 파이프 라인에서 동작하는 쉐이더 Pixel Shader : 픽셀 파이프 라인에서 동작하는 쉐이더 셰이더 렌더링 파이프라인을 조종할 수 있는 프로그래밍 언어이다. 버텍스 쉐이더의 ..