Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Nadat een effect is gemaakt, is de volgende stap het compileren van de code om te controleren op syntaxisproblemen.
U doet dit door een van de compile-API's aan te roepen (D3DX11CompileFromFile, D3DX11CompileFromMemoryof D3DX11CompileFromResource ). Deze API's roepen de effectcompilator aan fxc.exe, waarmee HLSL-code wordt gecompileerd. Daarom lijkt de syntaxis voor code in een effect erg op HLSL-code. (Er zijn enkele uitzonderingen die later worden verwerkt). De effectcompilator/hlsl-compiler, fxc.exe, is beschikbaar in de SDK in de map hulpprogramma's, zodat shaders (of effecten) offline kunnen worden gecompileerd als u dat kiest. Raadpleeg de documentatie voor het uitvoeren van de compiler vanaf de opdrachtregel.
- voorbeeld van
- bevat
- Zoeken naar bestanden opnemen
- macro's
- HLSL-arceringsvlagmen
- FX-vlaggen
- Fouten controleren
- Verwante onderwerpen
Voorbeeld
Hier volgt een voorbeeld van het compileren van een effectbestand.
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 );
Bevat
Een parameter van de compile-API's is een include-interface. Genereer een van deze als u een aangepast gedrag wilt opnemen wanneer de compiler een insluitingsbestand leest. De compiler voert dit aangepaste gedrag uit telkens wanneer deze een effect maakt of compileert (dat gebruikmaakt van de insluitingsaanwijzer). Als u aangepast include-gedrag wilt implementeren, moet u een klasse afleiden uit de ID3DInclude-interface. Dit biedt uw klas twee methoden: openen en sluiten. Implementeer het aangepaste gedrag in deze methoden.
Zoeken naar include-bestanden
De aanwijzer die de compiler doorgeeft in de parameter pParentData naar de methode Open van de handler, verwijst mogelijk niet naar de container met het #include-bestand dat de compiler nodig heeft om de shader-code te compileren. Dat wil bijvoorbeeld dat de compiler NULL- doorgeeft in pParentData-. Daarom raden we u aan dat uw insluitingshandler een eigen lijst met insluitingslocaties voor inhoud doorzoekt. Uw insluitingshandler kan dynamisch nieuwe include-locaties toevoegen, omdat deze locaties in aanroepen naar de bijbehorende methode Open ontvangt.
Stel in het volgende voorbeeld dat de insluitingsbestanden van de shader-code beide zijn opgeslagen in de ergens map. Wanneer de compiler de Methode Open van de include-handler aanroept om de inhoud van ergens ergens te openen en te lezen, kan de handler voor opnemen de locatie van de ergens map opslaan. Later, wanneer de compiler de methode include handler Open aanroept om de inhoud van bar.hte openen en te lezen, kan de insluitingshandler automatisch zoeken in de ergens in de map naar bar.h.
Main.hlsl:
#include "somewhereelse\foo.h"
Foo.h:
#include "bar.h"
Macro 's
Effectcompilatie kan ook een aanwijzer naar macro's nemen die elders zijn gedefinieerd. Stel dat u het effect in BasicHLSL10 wilt wijzigen om twee macro's te gebruiken: nul en één. De effectcode die gebruikmaakt van de twee macro's, wordt hier weergegeven.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Hier volgt de declaratie voor de twee macro's.
D3D10_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
De macro's zijn een door NULL beëindigde matrix met macro's; waarbij elke macro wordt gedefinieerd met behulp van een D3D10_SHADER_MACRO struct.
Wijzig de aanroep compileereffect om een aanwijzer naar de macro's te maken.
D3DX11CompileFromFile( str, Shader_Macros, NULL, pFunctionName,
pProfile, D3D10_SHADER_ENABLE_STRICTNESS, NULL,
NULL, &pBlob, &pErrorBlob, NULL );
HLSL-arceringsvlagmen
Arceringsvlagmen geven arceringsbeperkingen op voor de HLSL-compiler. Deze vlaggen zijn van invloed op de code die door de shader-compiler wordt gegenereerd op de volgende manieren:
- Optimaliseer de codegrootte.
- Inclusief foutopsporingsinformatie, waardoor stroombeheer wordt voorkomen.
- Dit is van invloed op het compileerdoel en of een shader kan worden uitgevoerd op verouderde hardware.
Deze vlaggen kunnen logisch worden gecombineerd als u geen twee conflicterende kenmerken hebt opgegeven. Zie D3D10_SHADER Constantenvoor een lijst met de vlaggen.
FX-vlaggen
Gebruik deze vlaggen wanneer u een effect maakt om compilatiegedrag of runtime-effectgedrag te definiëren. Zie D3D10_EFFECT Constantenvoor een lijst met de vlaggen.
Fouten controleren
Als tijdens het compileren een fout optreedt, retourneert de API een interface die de fouten van de effectcompilator bevat. Deze interface wordt ID3DBlob-genoemd. Het is niet rechtstreeks leesbaar; Als u echter een aanwijzer retourneert naar de buffer die de gegevens bevat (een tekenreeks), kunt u compilatiefouten zien.
Dit voorbeeld bevat een fout in de BasicHLSL.fx, de eerste variabeledeclaratie vindt twee keer plaats.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Deze fout zorgt ervoor dat de compiler de volgende fout retourneert, zoals wordt weergegeven in de volgende schermopname van het venster Controle in Microsoft Visual Studio.
Omdat de compiler de fout in een LPVOID-aanwijzer retourneert, cast deze naar een tekenreeks in het venster Watch.
Hier volgt de code die de fout van de mislukte compileer retourneert.
// 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
}
Verwante onderwerpen