Compilar um efeito (Direct3D 11)
Depois que um efeito tiver sido criado, a próxima etapa é compilar o código para verificar se há problemas de sintaxe.
Para fazer isso, chame uma das APIs de compilação (D3DX11CompileFromFile, D3DX11CompileFromMemoryou D3DX11CompileFromResource ). Essas APIs invocam o compilador de efeitos fxc.exe, que compila o código HLSL. É por isso que a sintaxe do código em um efeito se parece muito com o código HLSL. (Existem algumas exceções que serão tratadas mais tarde). O compilador de efeitos/compilador hlsl, fxc.exe, está disponível no SDK na pasta de utilitários para que os sombreadores (ou efeitos) possam ser compilados offline, se você escolher. Consulte a documentação para executar o compilador a partir da linha de comando.
- Exemplo
- Inclui
- Procurando por arquivos de inclusão
- Macros
- Bandeiras HLSL Shader
- Bandeiras FX
- Verificação de erros
- Tópicos relacionados
Exemplo
Aqui está um exemplo de compilação de um arquivo de efeito.
WCHAR str[MAX_PATH];
DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX11CompileFromFile( str, NULL, NULL, pFunctionName, pProfile, D3D10_SHADER_ENABLE_STRICTNESS, NULL, NULL, &pBlob, &pErrorBlob, NULL );
Inclui
Um parâmetro das APIs de compilação é uma interface de inclusão. Gere um deles se quiser incluir um comportamento personalizado quando o compilador ler um arquivo include. O compilador executa esse comportamento personalizado cada vez que cria ou compila um efeito (que usa o ponteiro de inclusão). Para implementar o comportamento de inclusão personalizado, derive uma classe do ID3DInclude interface. Isso fornece à sua classe dois métodos: Abrir e Fechar. Implemente o comportamento personalizado nesses métodos.
Procurando por arquivos de inclusão
O ponteiro que o compilador passa no parâmetro pParentData para o método Opendomanipulador de inclusão pode não apontar para o contêiner que inclui o arquivo #include que o compilador precisa para compilar o código do sombreador. Ou seja, o compilador pode passar NULL em pParentData. Portanto, recomendamos que seu manipulador de inclusão pesquise sua própria lista de locais de inclusão de conteúdo. Seu manipulador de inclusão pode adicionar dinamicamente novos locais de inclusão à medida que recebe esses locais em chamadas para seu método Open .
No exemplo a seguir, suponha que os arquivos de inclusão do código do sombreador estejam armazenados no em algum outro lugar diretório. Quando o compilador chama o método Opendo manipulador includepara abrir e ler o conteúdo de em algum lugar\foo.h, o manipulador de inclusão pode salvar o local do em algum outro lugar diretório. Mais tarde, quando o compilador chama o método Open do manipulador include para abrir e ler o conteúdo de bar.h, o manipulador include pode pesquisar automaticamente no diretório em algum lugar por bar.h.
Main.hlsl:
#include "somewhereelse\foo.h"
Foo.h:
#include "bar.h"
Macros
A compilação de efeitos também pode levar um ponteiro para macros definidas em outro lugar. Por exemplo, suponha que você queira modificar o efeito em BasicHLSL10, para usar duas macros: zero e uma. O código de efeito que usa as duas macros é mostrado aqui.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Aqui está a declaração para as duas macros.
D3D10_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
As macros são uma matriz de macros terminada por NULL; onde cada macro é definida usando um D3D10_SHADER_MACRO struct.
Modifique a chamada de efeito de compilação para levar um ponteiro para as macros.
D3DX11CompileFromFile( str, Shader_Macros, NULL, pFunctionName,
pProfile, D3D10_SHADER_ENABLE_STRICTNESS, NULL,
NULL, &pBlob, &pErrorBlob, NULL );
Bandeiras HLSL Shader
Os sinalizadores de sombreador especificam restrições de sombreador para o compilador HLSL. Esses sinalizadores afetam o código gerado pelo compilador de sombreador das seguintes maneiras:
- Otimize o tamanho do código.
- Incluindo informações de depuração, o que impede o controle de fluxo.
- Afeta o destino da compilação e se um sombreador pode ser executado em hardware herdado.
Esses sinalizadores podem ser logicamente combinados se você não tiver especificado duas características conflitantes. Para obter uma lista das bandeiras, consulte D3D10_SHADER Constantes.
Bandeiras FX
Use esses sinalizadores ao criar um efeito para definir o comportamento de compilação ou o comportamento de efeito de tempo de execução. Para obter uma lista das bandeiras, consulte D3D10_EFFECT Constantes.
Verificação de erros
Se durante a compilação ocorrer um erro, a API retornará uma interface que contém os erros do compilador de efeitos. Essa interface é chamada ID3DBlob. Não é diretamente legível; No entanto, retornando um ponteiro para o buffer que contém os dados (que é uma cadeia de caracteres), você pode ver quaisquer erros de compilação.
Este exemplo contém um erro no BasicHLSL.fx, a primeira declaração de variável ocorre duas vezes.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Este erro faz com que o compilador retorne o seguinte erro, conforme mostrado na captura de tela a seguir da janela Watch no Microsoft Visual Studio.
Como o compilador retorna o erro em um ponteiro LPVOID, converta-o em uma cadeia de caracteres na janela Inspeção.
Aqui está o código que retorna o erro da compilação com falha.
// Read the D3DX effect file
WCHAR str[MAX_PATH];
ID3DBlob* l_pBlob_Effect = NULL;
ID3DBlob* l_pBlob_Errors = NULL;
hr = DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX11CompileFromFile( str, NULL, NULL, pFunctionName,
pProfile, D3D10_SHADER_ENABLE_STRICTNESS, NULL,
NULL, &pBlob, &pErrorBlob, NULL );
LPVOID l_pError = NULL;
if( pErrorBlob )
{
l_pError = pErrorBlob->GetBufferPointer();
// then cast to a char* to see it in the locals window
}
Tópicos relacionados