그래픽스 30

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

[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쉐이더 입력 구조체에 데이터..