Compilando sombreadores
Observação
Este tópico aborda o compilador de FXC.EXE
usado para Shader Models 2 a 5.1. Para o Shader Model 6, use DXC.EXE
ao invés de, o que está documentado em Usando dxc.exe e dxcompiler.dll. O Visual Studio usará DXC.EXE
automaticamente quando o Shader Model 6 for selecionado para a configuração da página de propriedades HLSL.
Microsoft Visual Studio pode compilar código de sombreador a partir de ficheiros *.hlsl e *.fx que incluis no teu projeto de C++.
Como parte do processo de compilação, o Visual Studio usa o compilador de código HLSL fxc.exe ou dxc.exe para compilar os arquivos de origem do sombreador HLSL em arquivos de objeto sombreador binário ou em matrizes de bytes definidas em arquivos de cabeçalho. 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 byte em um cabeçalho, aumentará o tamanho e o tempo de carregamento inicial do seu aplicativo. Você também força todo o bytecode a residir na memória, mesmo depois de o sombreador ser criado, o que desperdiça recursos. Mas quando você inclui código de byte em um cabeçalho, você pode reduzir a complexidade do código e simplificar a criação de sombreador.
Vamos agora 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 sombreador
- Compilando em tempo de compilação para arquivos de objeto
- Compilando em tempo de compilação para arquivos de cabeçalho
- Compilando com D3DCompileFromFile
- Tópicos relacionados
- Tópicos relacionados
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 código-fonte High Level Shading Language (HLSL). A extensão .fx mais antiga também é suportada, mas geralmente está associada ao sistema de efeitos herdado.
- Um arquivo com a extensão .cso contém um objeto 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 durante a compilação para ficheiros 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 a partir 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 Output Files para o ficheiro SimpleVertexShader.hlsl especifica a compilação para o ficheiro 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 procurará no diretório de trabalho atual, bem como no mesmo diretório do arquivo EXE do processo atual, pois os arquivos .cso são normalmente encontrados ao lado de outros produtos de compilação 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 que são definidas em arquivos de cabeçalho, você precisará incluir esses arquivos de cabeçalho em seu código. Neste código de exemplo, a propriedade Output Files para o arquivo PixelShader.hlsl especifica que deve ser compilada em uma 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 de sombreador para o Direct3D 11. Para obter mais informações sobre como fazer isso, consulte Como compilar um sombreador.
Observação
As aplicações da Windows Store oferecem suporte ao uso de D3DCompileFromFile para desenvolvimento, mas não para implantação.
Tópicos relacionados
Tópicos relacionados