그래픽스

    NDC (Clip Space)란 무엇인가?

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

    좌표계 (Coordinate system)와 수학적 공간 (Mathematical space)

    일반적인 공간인 '유클리드 공간(Euclidean space)'에서 보통 어떤 수학/물리적 문제를 다룬다. 사실 어떤 물리적 사건을 표현할 때에 '어떤 공간을 사용하는가'는 '어떤 좌표계를 사용하는가'만큼이나 중요하다. 심지어 좌표계와 공간(space)을 헷갈려하는 학생들 또한 매우 많다.우선 공간부터 살펴보자. 아주 옛날인 기원전 300년 쯤 고대 그리스의 유클리드는 기하학을 연구하였고, 그가 정리한 5가지 원칙을 만족하는 아주 기본적인 공간을 유클리드 공간이라 부른다. 아래 그림은 우리에게 매우 익숙한 3차원 유클리드 공간이다.   직선(line)은 1차원 유클리드 공간의 예이다. 이러한 직선은 어떠한 '단위간격(unit interval)'로 측정/표현할 수 있다. 아무렇게나 '단위간격'을 정한 후,..

    동차 좌표계란?

    투영변환이란실세계의 한 점 Q = (x, y, z)는 3차원의 점이다.이 점이 투영 스크린상의 한 점 (x, y)의 2차원으로 변환되는 것이 투영 변환이다.투영 변환을 위해서는 동차 좌표계를 사용하는 것이 편리하다.동차 좌표계란?3D에서는 기본적으로 3차원 좌표계이지만 어떤 목적으로 4차원으로 확장이 가능하다.어떤 목적을 위해 한 차원의 좌표(n) 을 추가한 좌표 (n+1)로 표현을 하는 것을 동차 좌표계라고 한다.ex) 4차원 좌표 =(x,y,z,w) => x/w , y/w , z/w 투영행렬에서 동차좌표를 이용하는 이유시점으로 보이는 점들의 위치가 중요한 것이 아니라 시점으로 부터의 방향이 중요하기 때문에 동차좌표를 사용한다. 투영 행렬을 위 그림으로 나타내면 3차원의 점들이 2차원 평면의 빨간 네모..

    레스터화기 단계 Rasterization

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

    투영 행렬 유도와 ndc

    우리가 살고있는 세계에는 원근감이라는게 있다. 가까운 물체는 크고 먼 물체는 작게 보이는 것이다.언리얼로 원근감이 있는 카메라와 없는 카메라를 비교해보자 왼쪽은 원근감이 없는 흔히말하는 오쏘그래픽인 카메라이고오른쪽은 시야각이 90도인 투영행렬이 들어간 카메라다.누가봐도 오른쪽이 원근감도 있고 우리가 사는 세계와 비슷하다. 왼쪽 같은 카메라를 사용하는 게임들도 있지만 원근감이 있는 게임을 만들려면 투영행렬이 필요한것이다. 원근감을 표현하는 카메라는 카메라로부터 시작하는 사각뿔의 앞부분이 잘린 시야영역을 사용한다. 그럼 상하 좌우 전후로 이루어진 절두체(FRUSTUM)이 나오게 된다.그 절두체를 X축 방향에서 보면 이와 같은 그림이 나온다. 그중 근 평면이 우리의 모니터 화면이고 카메라로 부터 근 평면까지의..

    지수의 밑변환 공식, 로그의 밑변환 공식 - 개념, 유도, 적용

    1. 개요지수함수와 로그함수로부터 파생되는 지수 방정식, 로그 방정식, 지수 부등식, 로그 부등식을 풀기 위해서는 밑을 같게 만들어줘야다. 서로 다른 지수나 로그의 밑을 같게 만들어주는 작업을 밑변환이라고 하는데 밑변환을 하는 이유는 서로 다른 차원(dimension)에 있는 항들을 같은 선상에서 비교하기 위해서다. 예를들어 우리나라 돈 1000원과 일본 돈 100앤의 가치를 비교하기 위해선 환율을 적용하여 기축통화인 미국 달러로 바꿔서 비교해야 한다. 또한 평균이 60점, 표준편차 10점인 정규분포를 따르는 집단에서 75점을 받은 학생과 평균이 40점, 표준편차 20점인 정규분포를 따르는 집단에서 70점을 받은 학생중 누가 더 우수한 학생인가를 비교하기 위해선 표준화(Z=(X-m)/σ)라는 작업을..

    로그(log) 계산 공식 (상용로그, 자연로그) 총정리

    계산 공식1. 진수와 밑이 동일한 숫자일 때, 지수의 값은 1이다.​ex ) log 4 4 = 1log 8 8 = 1 2. 진수가 어떠한 숫자의 제곱일 때, 제곱은 앞으로 뺄 수 있다.ex)log 2 4 = log 2 22 = 2 log 2 2 = 2log 3 27 = log 3 3 3 = 3 log 3 3 = 3 3. 밑이 동일한 로그끼리의 덧셈은 진수끼리의 곱하기로 합칠 수 있다.ex) log 2 4 + log 2 8 = log 2 32 = 5 log 3 9 + log 3 9 = log 3 81 = 4 4. 밑이 동일한 로그끼리의 뺄셈은 진수끼리의 나누기로 합칠 수 있다.ex)log 2 8..

    드로우콜 (Draw Call)

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

    배칭 (Batching)

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

    병목 (Bottleneck)

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