Sdílet prostřednictvím


Kompilace efektu (Direct3D 10)

Po vytvoření efektu je prvním krokem kompilace kódu pro kontrolu problémů se syntaxí. To se provádí voláním jednoho z kompilačních rozhraní API (například D3DX10CompileEffectFromFile, D3DX10CompileEffectFromResource, D3DX10CompileEffectFromMemory). Toto rozhraní API vyvolá kompilátor efektu fxc.exe, což je kompilátor použitý ke kompilaci kódu HLSL. To je důvod, proč syntaxe kódu v efektu vypadá velmi podobně jako kód HLSL (existuje několik výjimek, které se budou zpracovávat později). Mimochodem, kompilátor efektů /hlsl kompilátor (fxc.exe) je v sadě SDK ve složce nástrojů, takže můžete kompilovat shadery (nebo efekty) offline, pokud zvolíte. Viz dokumentace ke spuštění kompilátoru z příkazového řádku.

Tady je příklad kompilace souboru efektu (z ukázky 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 );

Zahrnuje

Jedním parametrem je rozhraní include. Pokud chcete zahrnout vlastní chování při čtení souboru include, vygenerujte jednu z těchto možností. Toto vlastní chování se spustí při každém vytvoření efektu (který používá ukazatel zahrnutí) nebo při kompilaci efektu (který používá ukazatel zahrnutí). Chcete-li implementovat přizpůsobené chování zahrnutí, odvození třídy z include rozhraní. Tato třída poskytuje dvě metody: Open a Close. Implementujte vlastní chování v metodách Open a Close.

Makra

Kompilace efektu může také převést ukazatel na makra, která jsou definována jinde. Předpokládejme například, že jste chtěli změnit efekt v BasicHLSL10 tak, aby používala dvě makra: nula a jedna. Tady se zobrazí kód efektu, který používá dvě makra.

if( bAnimate )
    vAnimatedPos += float4(vNormal, zero) *  
        (sin(g_fTime+5.5)+0.5)*5;
        
    Output.Diffuse.a = one;         

Tady je deklarace dvou maker.

D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };

Makra jsou ukončené polem s hodnotou NULL. kde je každé makro definováno pomocí struktury D3D_SHADER_MACRO.

Nakonec upravte volání efektu kompilace tak, aby se ukazatel na makra.

D3DX10CreateEffectFromFile( str, Shader_Macros, NULL, 
    D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL, 
    &g_pEffect10, NULL );

Příznaky shaderu HLSL

Příznaky shaderu určují omezení shaderu kompilátoru HLSL. Tyto příznaky mají vliv na kód vygenerovaný kompilátorem shaderu, včetně:

  • Důležité informace o velikosti: optimalizujte kód.
  • Důležité informace o ladění: včetně informací o ladění, zabránění řízení toku.
  • Aspekty hardwaru: cíl kompilace a to, jestli může shader běžet na starším hardwaru.

Obecně platí, že tyto příznaky lze logicky zkombinovat za předpokladu, že jste nezadáli dvě konfliktní charakteristiky. Seznam příznaků najdete konstanty efektu (Direct3D 10).

FX Flags

Tyto příznaky používané při vytváření efektu definují chování kompilace nebo chování efektu za běhu. Seznam příznaků najdete konstanty efektu (Direct3D 10).

Kontrola chyb

Pokud během kompilace dojde k chybě, rozhraní API vrátí rozhraní, které obsahuje chyby vrácené kompilátorem efektu. Toto rozhraní se nazývá ID3D10Blob. Není však přímo čitelný vrácením ukazatele na vyrovnávací paměť, která obsahuje data (což je řetězec), můžete zobrazit jakékoli chyby kompilace.

V tomto příkladu byla do efektu BasicHLSL.fx zavedena chyba zkopírováním první deklarace proměnné dvakrát.

//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor;      // Material's ambient color

// Declare the same variable twice
float4 g_MaterialAmbientColor;      // Material's ambient color

Tato chyba způsobila, že kompilátor vrátil následující chybu, jak je znázorněno na následujícím snímku obrazovky okna kukátka v sadě Microsoft Visual Studio.

snímek obrazovky okna kukátka sady Visual Studio

Vzhledem k tomu, že se chyba vrátí v ukazateli LPVOID, přetypujte ji na řetězec znaků v okně kukátka.

Tady je kód, který se používá k vrácení chyby z neúspěšné kompilace.

// 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
}

vykreslení efektu (Direct3D 10)