Compilación de un efecto (Direct3D 10)
Una vez creado un efecto, el primer paso es compilar el código para comprobar si hay problemas de sintaxis. Esto se hace llamando a una de las API de compilación (como D3DX10CompileEffectFromFile, D3DX10CompileEffectFromResource, D3DX10CompileEffectFromMemory). Estas API invocan al compilador de efectos fxc.exe que es el compilador que se usa para compilar código HLSL. Este es el motivo por el que la sintaxis del código en un efecto es muy similar al código HLSL (hay algunas excepciones que se controlarán más adelante). Por cierto, el compilador de efectos/compilador hlsl (fxc.exe) está en el SDK de la carpeta utilidades para que pueda compilar los sombreadores (o efectos) sin conexión si lo elige. Consulte la documentación para ejecutar el compilador desde la línea de comandos.
Este es un ejemplo de compilación de un archivo de efecto (del ejemplo BasicHLSL10).
WCHAR str[MAX_PATH];
DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX10CompileEffectFromFile( str, NULL, NULL, "fx_4_0",
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&l_pBlob_Effect, &l_pBlob_Errors, NULL );
Includes
Un parámetro es una interfaz de inclusión. Genere uno de estos si desea incluir un comportamiento personalizado al leer un archivo de inclusión. Este comportamiento personalizado se ejecuta cada vez que se crea un efecto (que usa el puntero de inclusión) o cuando se compila un efecto (que usa el puntero de inclusión). Para implementar el comportamiento de inclusión personalizado, derive una clase de la interfaz Include. Esto proporciona a la clase dos métodos: Open y Close. Implemente el comportamiento personalizado en los métodos Open y Close.
Macros
La compilación de efectos también puede tomar un puntero a las macros que se definen en otro lugar. Por ejemplo, supongamos que va a modificar el efecto en BasicHLSL10, para usar dos macros: cero y una. Aquí se muestra el código de efecto que usa las dos macros.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Esta es la declaración de las dos macros.
D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
Las macros son una matriz terminada en NULL de macros; donde cada macro se define con una estructura D3D_SHADER_MACRO .
Por último, modifique la llamada de efecto de compilación para tomar un puntero a las macros.
D3DX10CreateEffectFromFile( str, Shader_Macros, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&g_pEffect10, NULL );
Marcas de sombreador HLSL
Las marcas de sombreador especifican restricciones de sombreador para el compilador HLSL. Estas marcas afectan al código generado por el compilador de sombreador, entre los que se incluyen:
- Consideraciones de tamaño: optimice el código.
- Consideraciones de depuración: incluida la información de depuración, lo que impide el control de flujo.
- Consideraciones de hardware: el destino de compilación y si un sombreador se puede ejecutar o no en hardware heredado.
En general, estas marcas se pueden combinar lógicamente, suponiendo que no se han especificado dos características en conflicto. Para obtener una lista de las marcas, consulta Constantes de efecto (Direct3D 10).
Marcas FX
Estas marcas se usan al crear un efecto para definir el comportamiento de compilación o el comportamiento del efecto en tiempo de ejecución. Para obtener una lista de las marcas, consulta Constantes de efecto (Direct3D 10).
Comprobación de errores
Si durante la compilación, se produce un error, la API devuelve una interfaz que contiene los errores devueltos por el compilador de efectos. Esta interfaz se denomina ID3D10Blob. No se puede leer directamente; sin embargo, al devolver un puntero al búfer que contiene los datos (que es una cadena), puede ver los errores de compilación.
En este ejemplo, se introdujo un error en el efecto BasicHLSL.fx copiando la primera declaración de variable dos veces.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Este error ha provocado que el compilador devuelva el siguiente error, como se muestra en la siguiente captura de pantalla de la ventana de watch en Microsoft Visual Studio.
Dado que el error se devuelve en un puntero LPVOID, lo convierte en una cadena de caracteres en la ventana watch.
Este es el código que se usa para devolver el error de la compilación con errores.
// Read the D3DX effect file
WCHAR str[MAX_PATH];
ID3D10Blob* l_pBlob_Effect = NULL;
ID3D10Blob* l_pBlob_Errors = NULL;
hr = DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX10CompileEffectFromFile( str, NULL, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL,
&l_pBlob_Effect, &l_pBlob_Errors );
LPVOID l_pError = NULL;
if( l_pBlob_Errors )
{
l_pError = l_pBlob_Errors->GetBufferPointer();
// then cast to a char* to see it in the locals window
}
Temas relacionados