WINDOWS/Direct3D - HLSL

HLSL 의 개요

게임 개발 2023. 10. 27. 18:03

 

왜 HLSL를 배우는가? 

 

 이유는 유니티 홈페이지를 구경하다가 해당 구문을 찾았다. 

 

Unity Documentation 발췌

 

유니티는 왜 HLSL을 쓸까? 고민했는데 간단하다.

DX를 쓰니, HLSL로 셰이더를 짠 것이다.

그럼 만약 회사에 들어가서 그래픽스에 관련된 작업을 해야할 때,

HLSL을 써야할 일이 생길 수도 있다는 생각이 들었고,

게임업계 관련 채용 공고를 찾아보니 HLSL을 사용한다고 써져있었기에 배운다.

 

 

본론

 

 게임 개발자가 되기 위해서는 특화된 여러가지 기술을 요한다.

대규모 멀티 프로그래밍,
그래픽 API, 

 

Direct3D는 렌더링 파이프라인을 사용하여
기본 요소를 그리거나 컴퓨팅 셰이더를 사용하여

병렬 작업을 수행하기 위한 하위 수준 API이다.

 

Direct3D 12 API를 사용하려면 D3d12.h를 포함하고,

D3d12.lib에 연결하거나 D3d12.dll에 직접 진입점을 쿼리(= 데이터 베이스에 정보를 요청)해야한다.

 

다음 헤더 및 라이브러리를 사용할 수 있다.

설치 위치는 컴퓨터에서 실행되는 windows 10 버전에 따라 달라진다.

 

 

자세한 내용은 이하  그래픽스/dx12 카테고리에서 다룰 것이니,

이 게시물에서는 간략히 이정도로 설명하겠다.

 

HLSL이 그래서 뭔데 DX를 간략히 설명했냐면,

HLSL은 DirectX에서 프로그래밍 가능한 셰이더와 함께하는 C와 유사한 고급 셰이더 언어이다.

 

OpenGL API에서 표준으로 사용되는 셰이딩 언어인 GLSL과 유사한 언어이다.

또한 NVIDIA의 Cg라는 셰이딩 언어와도 매우 유사하다.

이유는 서로 협력하여 개발하였기 때문이다.

 

예를 들어, HLSL을 사용하여 꼭짓점 셰이더 또는, 픽셀 셰이더를 작성하고

Direct3D 애플리케이션의 렌더러 구현에서 해당 쎼이더를 사용할 수 있다.

 

또는 HLSL을 사용하여 컴퓨팅 셰이더를 작성하여

물리학 시뮬레이션을 구현할 수도 있다.

그러나 예를 들어 컴퓨팅 셰이더에서 고유한 컨볼루션 연산자(합성곱 연산, 이미지 처리용)을

HLSL로 작성하려는 경우 DirectML을 대신 사용하는 경우 더 나은 성능을 얻을 수 있다.

 

HLSL에 대한 프로그래밍 지침

 

데이터가 그래픽 파이프라인을 기본 요소의 스트림으로 입력하고, 셰이더 단계에서 처리된다.

실제 셰이더 단계에는 Direct3D의 버전에 따라 다르지만,

확실히 꼭짓점, 기하 도형 및 픽셀 단계가 포함되어 있다.

다른 단계에는 공간 분할을 위한 HS 및 도메인 셰이더와 컴퓨팅 셰이더가 포함되어 있다.

이러한 단계에서는 HLSL을 사용하여 완벽하게 프로그래밍 할 수 있다.

 

HLSL 셰이더는 제작 시 또는 런타임에 컴파일하고,

런타임에 적절한 파이프라인 단계로 설정할 수 있다.

Direct3D 12는 셰이더 모델 5.1, 셰이더 모델6을 토대로 설계할 수 있다.

 

현재 셰이더 모델은 6.4까지 나와있다.

 

필자는 셰이더 모델 6을 토대로 설계해가며,

각종 코드를 만들어보며 포스팅 할 예정이다.

 

그래픽스 파이프라인은 다음과 같다.

 

 

셰이더 모델 6.0

 

이전 셰이더 모델의 경우 HLSL 프로그래밍은 실행의 단일 스레드만 노출한다.

모델 6.0 부터는
GPU의 병렬 처리를 명시적으로 활용할 수 있도록 새로운 웨이브 수준 작업이 제공된다.

이말은 즉슨 단일 스레드가 아닌 멀티 스레드를 이용한다는 뜻이다.

많은 스레드가 동일한 코어의 잠금 단계에서 동시에 실행될 수 있다.

동기화 범위가 SIMD 프로세서의 너비 내에 있거나 서로에게 상대적인 원자성이 있는 것으로 알려진

다른 스레드 세트 내에 있는 경우에는 배리어 구문을 제거한다.

 

 

참고 사이트

https://learn.microsoft.com/ko-kr/windows/win32/direct3dhlsl/hlsl-shader-model-6-0-features-for-direct3d-12