Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När en effekt har skapats är det första steget att kompilera koden för att söka efter syntaxproblem. Detta görs genom att anropa ett av kompilerings-API:erna (till exempel D3DX10CompileEffectFromFile, D3DX10CompileEffectFromResource, D3DX10CompileEffectFromMemory). Dessa API:er anropar effektkompilatorn fxc.exe som är kompilatorn som används för att kompilera HLSL-kod. Därför ser syntaxen för kod i en effekt ut ungefär som HLSL-kod (det finns några undantag som kommer att hanteras senare). Förresten finns effektkompilatorn/hlsl-kompilatorn (fxc.exe) i SDK:t i mappen verktyg så att du kan kompilera dina skuggningar (eller effekter) offline om du vill. Se dokumentationen för att köra kompilatorn från kommandoraden.
Här är ett exempel på kompilering av en effektfil (från BasicHLSL10-exemplet).
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 );
Innehåller
En parameter är ett include-gränssnitt. Generera en av dessa om du vill inkludera ett anpassat beteende när du läser en inkluderingsfil. Det här anpassade beteendet körs varje gång en effekt (som använder inkluderingspekaren) skapas eller när en effekt (som använder inkluderingspekaren) kompileras. Om du vill implementera anpassat inkluderingsbeteende härleder du en klass från include-gränssnittet. Detta ger klassen två metoder: Öppna och Stäng. Implementera det anpassade beteendet i metoderna Öppna och Stäng.
Makron
Effektkompilering kan också ta en pekare till makron som definieras någon annanstans. Anta till exempel att du skulle ändra effekten i BasicHLSL10 för att använda två makron: noll och ett. Effektkoden som använder de två makrona visas här.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Här är deklarationen för de två makrona.
D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
Makrona är en NULL-avslutad matris med makron. där varje makro definieras med en D3D_SHADER_MACRO struct.
Slutligen ändrar du kompileringseffektanropet för att ta en pekare till makrona.
D3DX10CreateEffectFromFile( str, Shader_Macros, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&g_pEffect10, NULL );
HLSL Shader-flaggor
Skuggningsflaggor anger skuggningsbegränsningar för HLSL-kompilatorn. Dessa flaggor påverkar koden som genereras av skuggningskompilatorn, inklusive:
- Storleksöverväganden: optimera koden.
- Överväganden för felsökning: inklusive felsökningsinformation, förebyggande flödeskontroll.
- Maskinvaruöverväganden: kompileringsmålet och huruvida en skuggning kan köras på äldre maskinvara.
I allmänhet kan dessa flaggor kombineras logiskt, förutsatt att du inte har angett två motstridiga egenskaper. En lista över flaggorna finns i Effect Constants (Direct3D 10).
FX-flaggor
Dessa flaggor används när du skapar en effekt för att definiera antingen kompileringsbeteende eller körningseffektbeteende. En lista över flaggorna finns i Effect Constants (Direct3D 10).
Kontrollera fel
Om ett fel uppstår under kompilering returnerar API:et ett gränssnitt som innehåller de fel som returneras från effektkompilatorn. Det här gränssnittet kallas ID3D10Blob. Det går dock inte att läsa direkt genom att returnera en pekare till bufferten som innehåller data (som är en sträng) och du kan se eventuella kompileringsfel.
I det här exemplet introducerades ett fel i BasicHLSL.fx-effekten genom att kopiera den första variabeldeklarationen två gånger.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Det här felet gjorde att kompilatorn returnerade följande fel, vilket visas i följande skärmbild av klockfönstret i Microsoft Visual Studio.
Eftersom felet returneras i en LPVOID-pekare skickar du det till en teckensträng i klockfönstret.
Här är koden som används för att returnera felet från den misslyckade kompilering.
// 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
}
Relaterade ämnen