본문 바로가기

All250

Geometry Shader 지오메트리 셰이더는 버텍스 셰이더와 픽셀 셰이더와 같은 셰이더의 한 종류이다. 버텍스 셰이더가 하나의 정점에 대한 연산을 수행하는 셰이더였다면, 지오메트리 셰이더는 하나의 Primitive에 대한 연산을 수행하는 셰이더이다. 즉 Primitive가 삼각형이라면 정점 3개를 받을 것이고, 라인이라면 2개 단위로 수행하게 된다. 세 개의 셰이더가 실행되는 순서는 다음과 같다. Vertex Shader -> Geometry Shader -> (Rasterizer) -> Pixel Shader 래스터라이저 전에 실행되므로 지오메트리 셰이더에선 아직 보간되지 않은 정보를 가지고 원하는 작업을 할 수 있다. 예를 들면 큐브를 렌더링 한다고 할 때 6개의 면을 가지게 되는데, 프리미티브 구성 방법을 Triangle .. 2021. 5. 27.
퀵 정렬(Quick Sort) 동작 - 까먹지 않도록 하기 위한 방법.. 퀵 정렬 동작을 까먹지 않도록 하기 위해 퀵정렬의 느낌과 동작을 정리를 해보았다. (오름 차순 기준) 퀵 정렬의 전체적인 그림은 배열에서 pivot이라는 기준을 정하고, 그 기준으로 왼쪽 영역은 pivot보다 더 작은(같거나) 원소들이 놓이도록, 오른쪽 영역은 더 큰(같거나) 원소들이 놓이도록 하는 것이다. 왼쪽 오른쪽 영역이 정렬되어 있을 필요는 없다. 그냥 pivot을 기준으로 크기가 작거나 크면된다. 이후엔 나뉜 왼쪽과 오른쪽 영역에 대해 다시 재귀적으로 quicksort를 진행한다. 그러면 왼쪽 영역에서 또 pivot을 정하고 영역을 나눌 것이고, 오른쪽 영역에 대해서도 마찬가지일 것이다. 이는 왼쪽 영역과 오른쪽 영역이 더 이상 나뉘지 않을 때, 즉 나누려는 영역이 1개이면 리턴한다. 이를 코드.. 2021. 5. 13.
셰이더로 행렬을 전달하기 전에 전치를 취해야 하는 이유는? 셰이더에 행렬을 전달하기 전에 다음과 같이 보통 Transpose를 취해야 한다. 그 이유를 검색해 보면 DX는 행렬을 row-major로 다루고, HLSL에선 column-major로 다루기에 전치로 전달하여 맞춰줘야 하기 때문이라고 한다. 맞는 말이겠지만 실제로 디버깅을 해보고 셰이더에서 행렬을 계산하는 코드를 보면 더욱 수긍이 간다. 테스트를 위해 셰이더에 다음과 같은 행렬을 전치하여 전달하였다. 이 행렬과 전치를 취한 행렬은 다음과 같다. 셰이더에서 위의 전치 행렬을 World로 받고 벡터 input.Pos와 곱연산을 하는 코드는 다음과 같다. 아래 연산 결과의 첫 요소는 실제로 input.Pos(1,1,-1,1)과 전치 취하기 전 행렬의 첫 열벡터인 (1,0,0,4)의 곱이여야 한다. (실제로 .. 2021. 5. 7.
[DX] 카메라 클래스 설계 및 구현 카메라 클래스? 여기서 카메라는 3D 공간에서 우리의 눈이 되어줄 가상의 오브젝트를 말한다. 월드 공간에 카메라를 임의의 위치에 놓으면 그 카메라 위치에서 보이는 물체들을 화면에 적절하게 나타낼 수 있어야 한다. 예를 들어 물체는 그대로지만 우리가 보는 시점에 따라 그 물체는 다르게 보인다. 카메라가 움직이면 우리가 보는 화면도 자연스럽게 변해야 한다. 이러한 기능을 담당하는 카메라 클래스가 필요하다. 렌더링 순서 월드 공간에 물체들이 있다. 월드 공간의 물체들은 View Transform(뷰 변환)과 Perspective Projection Transform(원근 투영 변환)을 통해 뷰 공간와 투영 공간으로 이동되어야 한다. 뷰 공간은 카메라 공간이라고도 한다. 위에서 보았듯이 카메라가 중심인 공간이다.. 2021. 5. 4.
XMMatrixLookAtLH과 XMMatrixLookToLH 차이 XMMatrixLookAtLH XMMATRIX XM_CALLCONV XMMatrixLookAtLH( FXMVECTOR EyePosition, FXMVECTOR FocusPosition, // At. 바라보려는 위치(position) FXMVECTOR UpDirection ); XMMatrixLookToLH XMMATRIX XM_CALLCONV XMMatrixLookToLH( FXMVECTOR EyePosition, FXMVECTOR EyeDirection, // 바라보고 있는 방향 FXMVECTOR UpDirection ); 두 함수 모두 월드 공간의 정점을 뷰 공간으로 변환시켜주는 view matrix를 생성하여 반환한다. 3개의 인자 중 Eye의 위치와 Up벡터는 동일한데, 2번 째 인자가 다르다. .. 2021. 5. 4.
Real-time rendering 원서 도전 드디어 그래픽스 책의 바이블이라는 리얼 타임 렌더링 책을 샀다. 번역본은 중고도 매물이 없어서 영어 공부도 할겸 그냥 원어로 샀다. 버전은 3판이다. 영어 문서는 읽어 봤지만 책을 원서로 사는 건 처음이다. 아무것도 안했는데 뭔가 뿌듯한 기분이 든다 ㅋㅋ 과연 이해할 수 있을까.. 그래픽스를 그래도 조금 공부해놔서 다행인 듯 함. 2021. 4. 30.