전체 글 102

[Directx12][17장]3차원 물체의 선택

개요 화면의 한 점을 클릭하여 해당 위치의 물체를 선택하는 로직을 구현할 수 있다. 이는 해당 방향으로 시야 원점에서 반직선을 쏘고 충돌하는 물체를 찾음으로써 구현 할 수 있다. ​ 선택 반직선 위에서 설명한 반빅선을 선택 반직선이라고 한다. 선택 반직선은 다음 과정을 통해 특정 오브젝트의 국소 공간 기준 반직선으로 계산될 수 있다. 1. 클릭된 뷰표트 좌표를 얻는다. 2. 뷰포트 좌표에 뷰포트 너비,높이 및 투영행렬의 00, 11번째 요소로 z값이 1인 투영창에서의 클릭 투영점을 얻는다. 3. 해당 투영점으로 시야공간에서의 반직선을 구할 수 있다. 4. 역 시야행렬을 곱해 월드 공간에서의 반직선을 구할 수 있다. 5. 각 오브젝트별로 역 월드행렬을 곱해 국소 공간의 반직선을 구할 수 있다. ​ 위에서 ..

[Directx12][16장][2]절두체 선별

개요 절두체 선별은 cpu에서 렌더링 파이프라인 전 각 오브젝트(인스턴스)들에 대해 그들의 경계입체가 시야 절두체와 충돌하는지 검사하고 충돌하지 않는 오브젝트는 제외하고 충돌하는 오브젝트들만 렌더링 파이프라인에 제출하는 기법을 이야기한다. 래스터화 단계의 절단에서 절두체에 속하지 않는 삼각형들을 제외하긴 하지만 그전에 api호출 비용이나, 정점 셰이더, 테셀레이션, 기하 셰이더에서는 그대로 계산이 되기에 cpu에서 절두체에 충돌하지않는 오브젝트는 미리 선별하여 렌더링 파이프라인에 제출자체를 하지않는다면 성능을 높일 수 있다. 만일 선별을 하지않는다면 gpu에서 오브젝트별로 수많은 정점들에 대해 연산을 해야하지만 선별을 한다면 오브젝트 별로 cpu에서 간단한 aabb, 구등의 경계입체와 절두체 사이의 충돌..

[Directx12][16장][1]인스턴싱

개요 지금까지는 DrawIndexedInstanced의 두번째 매개변수인 인스턴스 갯수를 1로 해서 렌더링 파이프라인을 실행했었다. 이 인스턴스 갯수를 1이상으로 하면 여러개의 인스턴스를 그릴 수 있다. 이는 보통 같은 메쉬의 오브젝트 여러개를 동시에 그릴때 활용된다. ​ 인스턴스 ID 인스턴스 개수를 n개로 하여 렌더링 파이프라인을 실행하면 우리가 넘겨준 색인 범위의 기하구조들을 n번씩 그리게 된다. 이때 한번의 색인 범위는 하나의 인스턴스가 되며 n번의 인스턴스 그리기가 이루어지는 셈이다. 이때 정점셰이더의 SV_InstanceID 의미소 매개변수에 현재 해당 정점의 소속 인스턴스 ID가 전달된다. 이 ID를 활용하여 인스턴싱 렌더링이 가능하다. 우선 월드행렬, 사용 재질 인덱스등의 인스턴스 오브젝트..

[Directx12][15장]1인칭 카메라 & 동적 색인화

1인칭 카메라 키보드 및 마우스의 조작을 통해 시야행렬을 실시간으로 수정하고 렌더링에 이를 활용하면 시야의 이동 및 회전, 즉 1인칭 카메라의 구현이 가능하다. 이는 카메라 클래스를 정의하여 관리하면 유용한데 현재 카메라의 위치, 방향(시야공간 기저)등과 그에 따른 시야행렬을 함께 관리하면된다. 추가로 카메라 렌즈 특성으로 표현될 수 있는 투영관련 상수 및 그에 따른 투영 행렬도 함께 관리하면 깔끔하다. ​ 동적 색인화 동적 색인화는 셰이더 자원으로 구조적 버퍼나 텍스처 배열등의 자원 배열을 선언한 후 여러 방식으로 얻을 수 있는 인덱스로 현재 필요한 데이터에 접근하여 사용하는 방식을 말한다. 이는 보통 오브젝트 데이터의 재질 인덱스로 재질 데이터 배열에 접근해 해당 오브젝트의 재질 정보에 접근하거나 재..

[Directx12][14장]테셀레이션

개요 테셀레이션은 정점셰이더와 기하셰이더 사이에 존재하는 단계로 각 도형들을 더 세분화된 도형으로 나누는 역할을 한다. 테셀레이션에서는 분리되기전의 한 기하도형을 패치라는 단위로 부른다. 이는 단순 삼각형같은 도형뿐 아닌 여러 제어점으로 곡면등의 특수한 기하도형을 나타내기도 하기 때문이다. ​ 테셀레이션은 다음 세단계로 구성된다. 덮개 셰이더 단계 : 실제 세분화전에 테셀레이션 세부 정도와 제어점들의 수정 및 추가를 하는 셰이더이다. 테셀 레이션 단계 : 덮개 셰이더의 입력을 토대로 실제 테셀레이션을 수행하는 자동으로 처리되는 단계이다. 영역 셰이더 단계 : 테셀레이션 된 후의 각 정점들에 대해 호출되는 정점셰이더 역할을 하는 셰이더이다. ​ 테셀레이션의 필요성 테셀레이션은 거리나 픽셀 포함 정도등의 정..

[Directx12][13장]계산셰이더

개요 GPU는 그래픽 렌더링 뿐 아니라 다양한 병렬 처리에 사용될 수 있다. 그러한 처리에 사용되는 것이 계산 셰이더 이다. 계산 셰이더는 렌더링 파이프라인에 포함되지않은 별개의 셰이더로 GPU를 이용하여 여러 병렬 계산을 할 수 있도록 해주는 셰이더이다. 계산 셰이더는 여러개의 스레드 그룹을 3차원 격자형태로 수행한다. 각 스레드 그룹은 여러개의 스레드를 3차원 격자형태로 수행한다. ​ ​하드웨어와 스레드 GPU는 여러개의 다중처리기로 구성되어있다. 다중처리기는 여러개의 코어로 구성되어있다. ​ 한 스레드는 한 코어에 의해 수행되며 한 스레드 그룹은 한 다중처리기에 의해 수행된다. 이때 다중처리기는 NVIDIA의 경우 32개, AMD는 64개의 코어로 구성되므로 한 스레드그룹에는 이의 배수에 해당하는 ..

[Directx12][12장]기하셰이더

개요 기하셰이더는 정점셰이더와 래스터화단계 사이에서 입력 기본 도형마다 한 번씩 처리되는 셰이더이다. 기하셰이더는 입력으로 렌더링에 사용된 기본 도형들을 입력받고 원하는 종류의 0~n개의 기본 도형들을 출력할 수 있다. 예를 들어 점들을 기본 입력 도형으로 하는 렌더링에서 기하셰이더는 한 점을 받아 두개의 삼각형으로 변환하여 출력할 수 있다. 이렇게 기하셰이더는 도형을 확장하거나 반대로 줄이거나 폐기하는 용도로 주로 사용된다. ​ ​ 코드 구조 기하셰이더의 기본구조는 다음과 같다. [maxvertexcount(n)] void GS(line GSInputVertexType gin[2], inout TriangleStream triStream) { ... } ​ [maxvertexcount(n)]는 이 기하..

[Directx12][11장]스텐실

개요 DirectX에서 스텐실은 픽셀단편을 후면버퍼에 그릴지말지 판정할 수 있는 깊이 판정외의 판정 수단이다. 스텐실 판정을 먼저 수행한 후 추가적으로 깊이 판정을 수행하며, 둘다 통과할시에만 후면버퍼에 픽셀단편이 그려지게 된다. 이러한 스텐실 판정은 스텐실을 설정할 때 다양한 기준으로 설정할 수 있다. 또한 스텐실 버퍼의 갱신은 스텐실 판정이 실패했을때, 깊이 판정이 실패했을때, 후면버퍼에 그려졌을때 각각에 대해 갱신 방법을 지정할 수 있다. 대표적인 사용예시는 평면 그림자, 거울 기능이다. ​ 스텐실 설정 PSO에 포함되는 D3D12_DEPTH_STENCIL_DESC구조체를 설정하여 스텐실을 활성화하고 여러 설정들을 할 수 있다. 다음은 핵심적인 스텐실 설정들이다. ​ 스텐실 판정 스텐실 판정은 렌더..

[Directx12][10장]혼합

개요 혼합 설정은 깊이판정에 성공한 픽셀 단편이 기존 후면버퍼의 해당 픽셀을 덮어쓸때 어떤식으로 덮어쓸지를 정할 수 있는 설정이다. 지금까지는 완전히 불투명한 물체들을 상정한 기본 혼합을 사용했다. 이는 깊이 판정에 성공한 픽셀단편이 기존 색상을 완전히 덮어씌우는 방식이 사용된 것이라고 보면된다. ​ 혼합 공식 혼합 방식은 다음과 같은 혼합 공식으로 정의된다. 여기서 src는 새 픽셀 단편이며 dst는 기존 후면버퍼 픽셀 색상이다. [#]은 설정가능한 이항연산중 하나이다. ​ 새 후면버퍼 픽셀 색상(rgb) = src색상 ⓧ src 혼합 계수 [#] dst색상 ⓧ dst 혼합 계수 새 후면버퍼 픽셀 색상(a) = srcA ⓧ srcA 혼합 계수 [#] dstA색상 ⓧ dstA 혼합 계수 ​ 이 공식들에서..