Compilar sombreadores

Nota

En este tema se trata el FXC.EXE compilador que se usa para los modelos de sombreador 2 a 5.1. Para el modelo de sombreador 6, se usa DXC.EXE en su lugar, que se documenta en Uso de dxc.exe y dxcompiler.dll. Visual Studio se usará DXC.EXE automáticamente cuando se seleccione Shader Model 6 para la configuración de la página de propiedades de HLSL.

Microsoft Visual Studio puede compilar código de sombreador desde archivos *.hlsl y *.fx que incluya en el proyecto de C++.

Como parte del proceso de compilación, Visual Studio usa el fxc.exe o dxc.exe compilador de código HLSL para compilar los archivos de origen del sombreador HLSL en archivos de objetos de sombreador binario o en matrices de bytes definidas en archivos de encabezado. La forma en que el compilador de código HLSL compila cada archivo de origen del sombreador del proyecto depende de cómo especifique la propiedad Ouput Files para ese archivo. Para obtener más información sobre las páginas de propiedades de HLSL, consulta Páginas de propiedades de HLSL.

El método de compilación que se usa normalmente depende del tamaño del archivo de origen del sombreador HLSL. Si incluyes una gran cantidad de código de bytes en un encabezado, aumentas el tamaño y el tiempo de carga inicial de la aplicación. También se fuerza a que todo el código de bytes resida en la memoria incluso después de crear el sombreador, que desperdicia recursos. Pero al incluir código de bytes en un encabezado, puede reducir la complejidad del código y simplificar la creación del sombreador.

Veamos ahora varias maneras de compilar el código y las convenciones del sombreador para las extensiones de archivo para el código de sombreador.

Uso de extensiones de archivo de código de sombreador

Para cumplir con la convención de Microsoft, use estas extensiones de archivo para el código del sombreador:

  • Un archivo con la extensión .hlsl contiene código fuente del lenguaje de sombreado de alto nivel (HLSL). También se admite la extensión .fx anterior, pero normalmente se asocia con el sistema de efectos heredado.
  • Un archivo con la extensión .cso contiene un objeto de sombreador compilado.
  • Un archivo con la extensión .h es un archivo de encabezado, pero en un contexto de código de sombreador, este archivo de encabezado define una matriz de bytes que contiene datos del sombreador. Otras extensiones comunes para los encabezados de código del sombreador HLSL incluyen .hlsli y .fxh.

Compilación en tiempo de compilación en archivos de objetos

Si compila los archivos .hlsl en archivos de objetos de sombreador binarios, la aplicación debe leer los datos de esos archivos de objeto (.cso es la extensión predeterminada para estos archivos de objeto), asignar los datos a matrices de bytes y crear objetos de sombreador a partir de esas matrices de bytes. Por ejemplo, para crear un sombreador de vértices (ID3D11VertexShader**), llame al método ID3D11Device::CreateVertexShader con una matriz de bytes que contiene código de bytes del sombreador de vértices compilado. En este código de ejemplo, la propiedad Ouput Files del archivo SimpleVertexShader.hlsl especifica que se compile en el archivo de objeto SimpleVertexShader.cso.

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

El asistente readData aquí buscará en el directorio de trabajo actual, así como en el mismo directorio que el archivo EXE del proceso actual que los archivos .cso se encuentran normalmente junto con otros productos de compilación de VS. Consulte ReadData.h para obtener un ejemplo de implementación.

Compilación en tiempo de compilación para los archivos de encabezado

Si compila los archivos .hlsl en matrices de bytes que se definen en archivos de encabezado, debe incluir esos archivos de encabezado en el código. En este código de ejemplo, la propiedad Ouput Files del archivo PixelShader.hlsl especifica que se compile en la matriz de bytes de g_psshader definida en el archivo de encabezado PixelShader.h.

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

Compilación con D3DCompileFromFile

También puede usar la función D3DCompileFromFile en tiempo de ejecución para compilar el código del sombreador para Direct3D 11. Para obtener más información sobre cómo hacerlo, consulta Cómo: Compilar un sombreador.

Nota

Las aplicaciones de la Tienda Windows admiten el uso de D3DCompileFromFile para el desarrollo, pero no para la implementación.

 

Guía de programación para HLSL

Guía de programación para HLSL