DirectX12 28

[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 혼합 계수 ​ 이 공식들에서..

[Directx12][9장]텍스처

개요 지금까지는 정점별 색상이나 오브젝트의 재질과 조명에 의해서 물체 표면의 색상을 정했다. 이제는 이미지파일을 물체 표면에 적용시키는 방법을 이야기 할 것이다. 우선 텍스처라는 자원에 대해 이야기하자면 기존에도 사용했던 후면버퍼나 깊이버퍼도 다 텍스처이다. 텍스처는 원소들의 n차원 배열(행렬)이다. 대부분의 경우 이미지를 담는 용도로 사용하지만 깊이버퍼처럼 다른 용도로도 많이 사용된다. 이러한 텍스처와 버퍼의 차이점은 텍스처는 밉맵 수준, 필터링, 다중표본화등의 gpu와 연관된 추가기능들이 가능하지만 특정 종류의 타입들만 원소로 사용할 수 있다. 그에 비해 버퍼는 그러한 기능들이 없는 대신 임의의 자료를 담을 수 있다. 아무튼 이번 장에서는 이미지를 담고 있는 텍스처를 이용하여 물체 표면에 그 이미지를..

[Directx12][8장][2]HLSL 구조체 채우기

HLSL 구조체 채우기 HLSL에서 사용하는 구조체(입력용 구조체 포함)은 메모리에 저장,해석될 때 다음과 같은 규칙을 따른다. 바로 32비트 4개짜리 벡터 단위로 저장이 된다. 예를 들어 다음 구조체는 메모리에 다음과 같이 저장된다. cbuffer cb1 : register(b0) { float4 a; float3 b; float c; float2 d; float3 e; } vector1 {a.x, a.y, a.z, a.w} vector2 {b.x, b.y, b.z, c} vector3 {d.x, d.y, empty, empty} vector4 {e.x,e.y,e.z,empty} ​ 위에서 보듯이 한 요소가 두 벡터에 걸쳐서 저장되는 것이 불가능하다. 따라서 cpu에서 gpu쉐이더 입력 구조체에 데이터..

[Directx12][8장][1]조명

개요 3차원 그래픽에서 사실같은 렌더링을 할때 꼭 필요한 요소는 바로 조명이다. 지금까지는 정점 별 색상을 이용해 물체의 특정 픽셀의 색상을 정했다. 하지만 이제부터는 광원과 해당 물체의 표면점의 위치와 면한 방향, 재질, 시점의 위치 등를 이용해서 해당 빛을 표면점이 반사해서 시점에 들어오며 나타나게될 색상을 정할 것이다. ​ 법선 벡터 법선 벡터는 물체의 표면점이 면한 방향을 나타내는 벡터이다. 좀 더 수학적으로는 해당 점의 접 평면에 수직인 벡터이다.(앞면 방향) 조명 렌더링을 위해선 각 표면점의 법선벡터가 필요한데 모든 점에 법선벡터를 일일히 설정할 수 없으므로 그 표면점의 삼각형을 나타내는 정점들에 정점 법선을 부여한다. 이후 래스터화 과정에서 해당 표면점에 해당하는 픽셀의 법선 벡터를 삼각형의..

[Directx12][7장]파이프라이닝2

프레임 자원 기존 방식에서는 cpu가 gpu에 명령 제출 후 flush를 통해 gpu가 명령들을 다 처리할때 까지 대기했다. 이러한 방식은 flush대기중에는 cpu가, flush후 다음 명령 제출까지는 gpu가 쉬게 된다. 이러한 성능 저하를 막기위해 프레임 자원이라는 기술을 사용한다. 기존에 flush를 통해 cpu가 gpu를 기다려줘야했던 이유는 commandAllocator 초기화 시점에 대한 이유와 매 프레임 변할 수 있는 자원들(오브젝트 위치 정보 등)을 gpu가 그리기를 처리하기도 전에 다음 프레임 값으로 바꿔버릴 위험이 있기 때문이었다. 따라서 commandAllocator 및 매 프레임 변하는 자원들을 묶어 프레임 자원이라는 것으로 만들고 이러한 프레임 자원 n개를 사용하면 기존의 방식보..