본문 바로가기

일하면서 사용한 짧은 지식/C++, DirectX11

DirectX11의 Shader를 컴파일하여 헤더파일로 만들기

1. 상황

 

DirectX11 렌더러 구성 작업 중 셰이더 코드를 수정하면서 동작을 확인해야할 필요가 있어서 렌더링할 때마다 셰이더 파일에서 컴파일하는 방법으로 구성했었다.

 

테스트를 완료하여 이제 셰이더 코드를 변경할 필요가 없어졌고, 현재 상태는 셰이더 코드가 그대로 노출되어 있기에 미리 컴파일하여 렌더링할 필요가 있었다.

 

검색결과 .cso(compiled shader object) 파일로 만들어서 패키지에 포함시킬 건지,

아니면 .header파일에 BYTE 배열로 만들어 빌드하여 렌더러 DLL에 합치는 방법 이렇게 2가지로 고민했었다.

 

이번 작업에서는 Shader를 미리 컴파일하는 목적이 셰이더 코드를 노출하지 않기 위함이라 헤더파일로 만들어서 DLL에 포함시키는 방법을 선택하였다.

 

 

2.  셰이더 컴파일(Fxc.exe) 이용방법

 

SDK 경로 : C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64

 

Vertex Shader와 PixelShader를 컴파일하였고, SDK 경로에서 아래 명령어를 실행했었다.

 

Vertex Shader

fxc /Zi /E"Vertex Shader 진입점" /Od /Fh"산출될 헤더파일 경로와 이름" “컴파일할 셰이더 경로와 이름” /T vs"_5_0" /nologo

 

Pixel Shader

fxc /Zi /E"Pixel Shader 진입점" /Od /Fh"산출될 헤더파일 경로와 이름" “컴파일할 셰이더 경로와 이름” /T ps"_5_0" /nologo

 

사용한 명령어 의미

/Zi - 디버그 정보를 유효하게 한다
/E <name> - 진입점. 기본 값은 main
/Od - 최적화를 무효로 한다.
/Fh - 헤더파일로 컴파일.
/T <target> - 타겟 명령 세트.
/nologo - 저작권에 관한 메시지를 출력하지 않는다.

 

3. Visual Studio에서 Fxc 컴파일을 하기 위해 셰이더 파일의 Properties 항목에서 설정이 필요한 것들.

 

General/Item Type

HLSL Compiler로 설정하여 HLSL로 컴파일 하겠다는 플래그를 설정

 

HLSL Compiler/All Options/Entrypoint Name

엔트리 포인트 설정

 

HLSL Compiler/All Options/Header File Name

컴파일 아웃풋 이름을 설정하는 부분

 

HLSL Compiler/All Options/Shader Model

셰이더 모델 설정

 

HLSL Compiler/All Options/Shader Type

Vertex, Pixel 등 셰이더 종류 선택

 

 

4. 컴파일된 헤더파일 사용

 

1> 컴파일된 헤더파일 프로젝트에 포함

2> 헤더파일 include

3> CreateVertexShader, CreateInputLayout, CreatePixelShader 메서드에서 헤더파일의 컴파일된 BYTE 배열을 사용하는 것으로 코드를 변경하였다.