다음을 통해 공유


셰이더 컴파일

참고

이 항목에서는 셰이더 모델 2~5.1에 사용되는 FXC.EXE 컴파일러에 대해 설명합니다. 셰이더 모델 6의 경우 dxc.exe 및 dxcompiler.dll 사용에 설명된 DXC.EXE를 대신 사용합니다. Visual Studio는 HLSL 속성 페이지 구성에 셰이더 모델 6이 선택된 경우 자동으로 DXC.EXE를 사용합니다.

Microsoft Visual Studio는 C++ 프로젝트에 포함시키는 *.hlsl 및 *.fx 파일을 통해 셰이더 코드를 컴파일할 수 있습니다.

빌드 프로세스의 일부로 Visual Studio는 fxc.exe 또는 dxc.exe HLSL 코드 컴파일러를 사용하여 HLSL 셰이더 소스 파일을 이진 셰이더 개체 파일 또는 헤더 파일에 정의된 바이트 배열로 컴파일합니다. HLSL 코드 컴파일러가 프로젝트의 각 셰이더 소스 파일을 컴파일하는 방법은 해당 파일의 Ouput Files 속성을 지정하는 방법에 따라 달라집니다. HLSL 속성 페이지에 대한 자세한 내용은 HLSL 속성 페이지를 참조하세요.

일반적으로 사용하는 컴파일 메서드는 HLSL 셰이더 원본 파일의 크기에 따라 달라집니다. 헤더에 많은 양의 바이트 코드를 포함하는 경우 앱의 크기 및 초기 로드 시간이 증가합니다. 또한 셰이더를 만든 후에도 강제로 모든 바이트 코드가 메모리에 있도록 하여 리소스를 낭비합니다. 그러나 헤더에 바이트 코드를 포함하면 코드 복잡성을 줄이고 셰이더 만들기를 간소화할 수 있습니다.

이제 셰이더 코드를 위한 파일 확장자용 셰이더 코드 및 규칙을 컴파일하는 다양한 방법을 살펴보겠습니다.

셰이더 코드 파일 확장자 사용

Microsoft 규칙을 준수하려면 셰이더 코드에 다음 파일 확장자를 사용합니다.

  • .hlsl 확장자가 있는 파일에는 HLSL(High Level Shading Language) 소스 코드가 있습니다. 이전의 .fx 확장자도 지원되지만 일반적으로 레거시 효과 시스템과 연결됩니다.
  • 확장자가 .cso인 파일은 컴파일된 셰이더 개체를 가집니다.
  • 확장자가 .h인 파일은 헤더 파일이지만, 셰이더 코드 맥락에서 보자면 이 헤더 파일은 셰이더 데이터를 보유하는 바이트 배열을 정의합니다. HLSL 셰이더 코드 헤더를 위한 다른 일반적인 확장자에는 .hlsli 및 .fxh가 포함됩니다.

빌드 시 개체 파일로 컴파일

.hlsl 파일을 이진 셰이더 개체 파일로 컴파일하는 경우 앱은 해당 개체 파일에서 데이터를 읽고(.cso는 이러한 개체 파일의 기본 확장자임), 바이트 배열에 데이터를 할당하고, 해당 바이트 배열에서 셰이더 개체를 만들어야 합니다. 예를 들어 꼭짓점 셰이더(ID3D11VertexShader**)를 만들려면 컴파일된 꼭짓점 셰이더 바이트 코드가 포함된 바이트 배열을 사용하여 ID3D11Device::CreateVertexShader 메서드를 호출합니다. 이 예제 코드에서 SimpleVertexShader.hlsl 파일의 Ouput Files 속성은 SimpleVertexShader.cso 개체 파일로 컴파일하도록 지정합니다.

        auto vertexShaderBytecode = ReadData("SimpleVertexShader.cso");
        ComPtr<ID3D11VertexShader> vertexShader;
        DX::ThrowIfFailed(
            m_d3dDevice->CreateVertexShader(
                vertexShaderBytecode->Data,
                vertexShaderBytecode->Length,
                nullptr,
                &vertexShader
                )

여기서 ReadData 도우미는 현재 작업 디렉터리뿐만 아니라 현재 프로세스의 EXE 파일과 같은 디렉터리도 살펴봅니다. 일반적으로 .cso 파일은 다른 VS 빌드 제품과 함께 찾을 수 있기 때문입니다. 예제 구현은 ReadData.h를 참조하세요.

빌드 시 헤더 파일로 컴파일

.hlsl 파일을 헤더 파일에 정의된 바이트 배열로 컴파일하는 경우 해당 헤더 파일을 코드에 포함해야 합니다. 이 예제 코드에서 PixelShader.hlsl 파일의 Ouput Files 속성은 PixelShader.h 헤더 파일에 정의된 g_psshader 바이트 배열로 컴파일하도록 지정합니다.

namespace
{
       include "PixelShader.h"
}
...
        ComPtr<ID3D11PixelShader> m_pPixelShader;
        hr = pDevice->CreatePixelShader(g_psshader, sizeof(g_psshader), nullptr, &m_pPixelShader);

D3DCompileFromFile을 사용하여 컴파일

런타임에 D3DCompileFromFile 함수를 사용하여 Direct3D 11에 대한 셰이더 코드를 컴파일할 수도 있습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 방법: 셰이더 컴파일을 참조하세요.

참고

Windows Store 앱은 배포가 아닌 개발 목적으로 D3DCompileFromFile 사용을 지원합니다.

 

HLSL에 대한 프로그래밍 지침

HLSL에 대한 프로그래밍 지침