기하 셰이더는 기본도형을 입력받는다. 기본도형 마다 기하 셰이더가 실행된다.

기하 셰이더는 기하구조를 새로 생성하거나 폐기할 수 있다.

기하 셰이더에서 나오는 정점 위치들은 반드시 동차 절단 공간으로 변환된 것이어야 한다.

12.1 기하 셰이더 프로그래밍

기하셰이더 한번의 호출로 출력할 최대 정점의 개수를 함수 정의 앞에 붙여야 한다.

[maxvertexCount(N)]

ㄴ N이 지나치게 크면 성능상의 문제가 생길 수 있다.

 

기하 셰이더의 입력 매개변수

ㄴ 입력되는 기본도형의 종류를 명시해야 한다. (point, line, triangle, lineadj, triangleadj)

기하 셰이더의 출력 매개변수

ㄴ inout 붙여야 한다.

ㄴ 기하 셰이더가 출력하는 기본도형의 정점들을 담는 스트림 형식의 객체를 사용한다. 

ㄴ 스트림 형식에 따라 기하 셰이더에서 나온 정점들이 만드는 기본도형의 종류가 달라진다. (PointStream, LineStream, TriangleStream)

 

TriangleStream 같은 경우 삼각형 띠를 출력하는데, 삼각형 목록을 출력하고 싶으면 RestartStrip을 사용하여 흉내낼 수 있다.

 

12.2 빌보드 기법

멀리 있는 물체를 3차원으로 렌더링 하는 대신 2차원 텍스처로 렌더링하고 카메라를 바라보도록 만드는 방법

 

 

기하 셰이더의 입력으로 들어오는 부호 없는 정수 매개변수의 의미소 형식 SV_PrimitiveID

ㄴ 입력 조립기 단계에서 기본도형마다 ID를 부여한다. ( 0, 1, 2 ... )

ㄴ 기하 셰이더나 픽셀 셰이더에서 사용할 수 있다.

 

12.3 텍스처 배열

텍스처 배열은 하나의 자원이다. 자원 서술 구조체에 DepthOrArraySize라는 필드가 있는데 원하는 배열 크기를 여기에 적으면 된다.

 

일반 텍스처 (Texture2D)

gDiffuseMap.Sample(gsamAnisotropicWrap, pin.TexC) * gDiffuseAlbedo;

 

텍스처 배열 (Texture2DArray)

float3 uvw = float3(pin.TexC, pin.PrimID%3);
float4 diffuseAlbedo = gTreeMapArray.Sample(gsamAnisotropicWrap, uvw) * gDiffuseAlbedo;

 

한번의 텍스처 배열 설정과 한번의 그리기 호출로 여러 기본도형에 서로 다른 텍스처를 그릴 수 있다. 

 

12.3.3 텍스처 배열 적재

밉맵 수준이 하나인 dds들을 합쳐서 텍스처 배열을 담은 dds 파일 하나를 만든다. (texassemble 도구)

그 후에 밉맵 생성, 픽셀 형식 변경 할 수 있다. (texconv 도구)

 

12.3.4 텍스처 부분 자원

텍스처 배열의 부분자원에 부여된 색인의 순서는 이렇게 된다.

12.4 알파 포괄도 변환

혼합 설정에서 AlphaToCoverage을 켜게 되면 MSAA 포괄도 계산시에 다각형 기준의 부분픽셀 중심의 위치만 고려하는 것이 아니라 알파 채널도 고려하게 된다.

일반적으로 불규칙한 형태를 알파 채널로 오려내느 식으로 활용하는 텍스처에 대해 사용하는 것이 바람직하다.

기본적으로 MSAA가 활성화 되어있어야 한다.

 

연습문제

1.

7장 예제 프로그램을 변형하여 진행했다.

GeometryGenerator에 xz평면에 만들어지는 원 기하구조를 생성하는 함수를 만들었다.
Default.hlsl의 정점셰이더와 픽셀셰이더로 그린 원의 기하구조
circle.hlsl의 기하 셰이더 함수

기본도형으로 line을 입력받아 2개의 정점을 linestream(선 띠) 형태로 출력하도록 만들었다.

출력되는 정점의 첫 번째 정점은 입력받은 line이 이루는 두 정점의 가운데 점이고

두번째 정점은 그 점에 y 값을 + 4.0f 해준 값이다.

결과

2.

시점과의 거리에 따른 세부 수준(LOD) 변화 구현

기하구조의 중심의 위치는 원점

시점과 기하구조의 거리에 따라 다른 스트림을 출력하도록 기하 셰이더 내부에서 다른 함수들을 사용한다.

4.

메시의 정점 법선 시각화
모든 renderitem의 정점 법선을 시각화 한다.
정점 법선 시각화를 위한 pso
정점 법선 기하 셰이더

정점을 기본도형으로 입력받아 정점 두개로 이루어진 line (법선)을 출력하는 기하 셰이더이다.

 

연습문제 파일

https://github.com/lemonyun/Directx12_study/tree/main/12

 

GitHub - lemonyun/Directx12_study: 2022/06/10

2022/06/10. Contribute to lemonyun/Directx12_study development by creating an account on GitHub.

github.com

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

14. 테셀레이션 단계들  (0) 2022.06.29
13. 계산 셰이더  (0) 2022.06.28
11. 스텐실 적용  (0) 2022.06.22
10. 혼합  (0) 2022.06.22
9. 텍스처 적용  (0) 2022.06.21

+ Recent posts