Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una vez creado un efecto, el primer paso es compilar el código para comprobar si hay problemas de sintaxis. Para ello, se llama 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 o compilador de efectos 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.
- Incluye
- macros de
- marcas de sombreador de HLSL
- de marcas FX
- comprobación de errores
- temas relacionados
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 );
Incluye
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 los dos métodos de la clase: 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 definidas en otro lugar. Por ejemplo, supongamos que tenía que modificar el efecto en BasicHLSL10, para usar dos macros: cero y uno. 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 de D3D_SHADER_MACRO.
Por último, modifique la llamada al 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 de HLSL
Las marcas de sombreador especifican restricciones de sombreador en 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 en hardware heredado.
En general, estas marcas se pueden combinar lógicamente, suponiendo que no haya especificado dos características en conflicto. Para obtener una lista de las marcas, vea 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, vea 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. Sin embargo, no es legible directamente devolviendo 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 provocó que el compilador devolva el siguiente error, como se muestra en la siguiente captura de pantalla de la ventana de inspección en Microsoft Visual Studio.
Dado que el error se devuelve en un puntero LPVOID, lo convierte en una cadena de caracteres en la ventana de inspección.
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