Compilando sombreadores

Observação

Este tópico aborda o FXC.EXE compilador usado para modelos de sombreador 2 a 5.1. Para o Modelo de Sombreador 6, use DXC.EXE em vez disso, que está documentado em Usando dxc.exe e dxcompiler.dll. O Visual Studio usará DXC.EXE automaticamente quando o Modelo de Sombreador 6 for selecionado para a configuração da Página de Propriedades HLSL.

O Microsoft Visual Studio pode compilar código de sombreador de arquivos *.hlsl e *.fx que você inclui em seu projeto C++.

Como parte do processo de build, o Visual Studio usa o compilador de código HLSLfxc.exeou dxc.exe para compilar os arquivos de origem do sombreador HLSL em arquivos de objeto de sombreador binário ou em matrizes de bytes definidas em arquivos de cabeçalho. A forma como o compilador de código HLSL compila cada arquivo de origem do sombreador em seu projeto depende de como você especifica a propriedade Ouput Files para esse arquivo. Para obter mais informações sobre páginas de propriedades HLSL, consulte Páginas de propriedades HLSL.

O método de compilação que você usa normalmente depende do tamanho do arquivo de origem do sombreador HLSL. Se você incluir uma grande quantidade de código de bytes em um cabeçalho, aumentará o tamanho e o tempo de carregamento inicial do aplicativo. Você também força todo o código de bytes a residir na memória mesmo depois que o sombreador é criado, o que desperdiça recursos. Mas ao incluir o código de byte em um cabeçalho, você pode reduzir a complexidade do código e simplificar a criação do sombreador.

Agora vamos examinar várias maneiras de compilar seu código de sombreador e convenções para extensões de arquivo para código de sombreador.

Usando extensões de arquivo de código de sombreador

Para estar em conformidade com a convenção da Microsoft, use estas extensões de arquivo para seu código de sombreador:

  • Um arquivo com a extensão .hlsl contém o código-fonte HLSL (High Level Shading Language). A extensão .fx mais antiga também tem suporte, mas geralmente está associada ao sistema de Efeitos herdado.
  • Um arquivo com a extensão .cso contém um objeto de sombreador compilado.
  • Um arquivo com a extensão .h é um arquivo de cabeçalho, mas, em um contexto de código de sombreador, esse arquivo de cabeçalho define uma matriz de bytes que contém dados de sombreador. Outras extensões comuns para cabeçalhos de código de sombreador HLSL incluem .hlsli e .fxh.

Compilando em tempo de compilação para arquivos de objeto

Se você compilar seus arquivos .hlsl em arquivos de objeto de sombreador binário, seu aplicativo precisará ler os dados desses arquivos de objeto (.cso é a extensão padrão para esses arquivos de objeto), atribuir os dados a matrizes de bytes e criar objetos de sombreador dessas matrizes de bytes. Por exemplo, para criar um sombreador de vértice (ID3D11VertexShader**), chame o método ID3D11Device::CreateVertexShader com uma matriz de bytes que contém código de byte de sombreador de vértice compilado. Neste código de exemplo, a propriedade Ouput Files para o arquivo SimpleVertexShader.hlsl especifica a compilação no arquivo de objeto SimpleVertexShader.cso.

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

O auxiliar ReadData aqui examinará o diretório de trabalho atual, bem como o mesmo diretório que o arquivo EXE do processo atual que os arquivos .cso normalmente são encontrados junto com outros produtos de build do VS. Consulte ReadData.h para obter um exemplo de implementação.

Compilando em tempo de compilação para arquivos de cabeçalho

Se você compilar seus arquivos .hlsl em matrizes de bytes definidas em arquivos de cabeçalho, será necessário incluir esses arquivos de cabeçalho em seu código. Neste código de exemplo, a propriedade Ouput Files para o arquivo PixelShader.hlsl especifica compilar na matriz de bytes g_psshader definida no arquivo de cabeçalho PixelShader.h.

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

Compilando com D3DCompileFromFile

Você também pode usar a função D3DCompileFromFile em tempo de execução para compilar o código do sombreador para Direct3D 11. Para obter mais informações sobre como fazer isso, consulte Como compilar um sombreador.

Observação

Os aplicativos da Windows Store dão suporte ao uso de D3DCompileFromFile para desenvolvimento, mas não para implantação.

 

Guia de programação para HLSL

Guia de programação para HLSL