Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Po utworzeniu efektu następnym krokiem jest skompilowanie kodu w celu sprawdzenia problemów ze składnią.
W tym celu należy wywołać jeden z interfejsów API kompilacji (D3DX11CompileFromFile, D3DX11CompileFromMemorylub D3DX11CompileFromResource ). Te interfejsy API wywołują kompilator efektów fxc.exe, który kompiluje kod HLSL. Dlatego składnia kodu w efekcie wygląda bardzo podobnie jak kod HLSL. (Istnieje kilka wyjątków, które będą obsługiwane później). Kompilator efektu/kompilator hlsl, fxc.exe, jest dostępny w zestawie SDK w folderze narzędzi, dzięki czemu cieniowanie (lub efekty) można skompilować w trybie offline, jeśli wybierzesz. Zapoznaj się z dokumentacją dotyczącą uruchamiania kompilatora z wiersza polecenia.
- Przykład
- obejmuje
- wyszukiwanie plików dołączanych
- makra
- flagi cieniowania HLSL
- flagi FX
- sprawdzanie błędów
- Tematy pokrewne
Przykład
Oto przykład kompilowania pliku efektu.
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 );
Zawiera
Jednym z parametrów interfejsów API kompilacji jest interfejs dołączania. Wygeneruj jeden z tych elementów, jeśli chcesz uwzględnić dostosowane zachowanie, gdy kompilator odczytuje plik dołączania. Kompilator wykonuje to zachowanie niestandardowe za każdym razem, gdy tworzy lub kompiluje efekt (który używa wskaźnika dołączania). Aby zaimplementować dostosowane zachowanie dołączania, należy utworzyć klasę z interfejsu ID3DInclude. Zapewnia to klasę dwie metody: Open i Close. Zaimplementuj zachowanie niestandardowe w tych metodach.
Wyszukiwanie plików dołączanych
Wskaźnik przekazany przez kompilator w parametrze pParentData do metody Open programu obsługi dołączania może nie wskazywać kontenera zawierającego plik #include, który kompilator musi skompilować kod cieniowania. Oznacza to, że kompilator może przekazać null w pParentData. W związku z tym zalecamy, aby program obsługi dołączania wyszukiwał własną listę lokalizacji dołączania zawartości. Program obsługi dołączania może dynamicznie dodawać nowe lokalizacje dołączania, ponieważ odbiera te lokalizacje w wywołaniach metody Open.
W poniższym przykładzie załóżmy, że pliki dołączania kodu cieniującego są przechowywane w w katalogu. Gdy kompilator wywołuje metodę Open obsługi dołączania, aby otworzyć i odczytać zawartość gdzieśelse\foo.h, program obsługi dołączania może zapisać lokalizację gdzieś katalogu. Później, gdy kompilator wywołuje metodę Open programu obsługi dołączania, aby otworzyć i odczytać zawartość bar.h, program obsługi dołączania może automatycznie wyszukiwać w katalogu dla bar.h.
Main.hlsl:
#include "somewhereelse\foo.h"
Foo.h:
#include "bar.h"
Makra
Kompilacja efektu może również przyjmować wskaźnik do makr zdefiniowanych gdzie indziej. Załóżmy na przykład, że chcesz zmodyfikować efekt w basicHLSL10, aby użyć dwóch makr: zero i jeden. Kod efektu, który używa dwóch makr, jest pokazany tutaj.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Oto deklaracja dwóch makr.
D3D10_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
Makra są tablicą makr zakończonych wartościami NULL; gdzie każde makro jest definiowane przy użyciu struktury D3D10_SHADER_MACRO.
Zmodyfikuj wywołanie efektu kompilacji, aby przejąć wskaźnik do makr.
D3DX11CompileFromFile( str, Shader_Macros, NULL, pFunctionName,
pProfile, D3D10_SHADER_ENABLE_STRICTNESS, NULL,
NULL, &pBlob, &pErrorBlob, NULL );
Flagi cieniowania HLSL
Flagi cieniowania określają ograniczenia cieniowania kompilatora HLSL. Te flagi wpływają na kod wygenerowany przez kompilator cieniowania w następujący sposób:
- Zoptymalizuj rozmiar kodu.
- Dołączanie informacji debugowania, które uniemożliwiają sterowanie przepływem.
- Wpływa na docelowy element docelowy kompilacji i czy moduł cieniowania może działać na starszym sprzęcie.
Te flagi można łączyć logicznie, jeśli nie określono dwóch cech powodujących konflikt. Aby uzyskać listę flag, zobacz D3D10_SHADER Stałe.
Flagi FX
Użyj tych flag podczas tworzenia efektu, aby zdefiniować zachowanie kompilacji lub zachowanie efektu środowiska uruchomieniowego. Aby uzyskać listę flag, zobacz D3D10_EFFECT Stałe.
Sprawdzanie błędów
Jeśli podczas kompilacji wystąpi błąd, interfejs API zwraca interfejs zawierający błędy z kompilatora efektu. Ten interfejs jest nazywany ID3DBlob. Nie można go bezpośrednio odczytać; Jednak zwracając wskaźnik do buforu zawierającego dane (czyli ciąg), można zobaczyć błędy kompilacji.
Ten przykład zawiera błąd w pliku BasicHLSL.fx, pierwsza deklaracja zmiennej występuje dwa razy.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Ten błąd powoduje, że kompilator zwróci następujący błąd, jak pokazano na poniższym zrzucie ekranu okna Obserwowanie w programie Microsoft Visual Studio.
zrzut ekranu 
Ponieważ kompilator zwraca błąd w wskaźniku LPVOID, rzutuj go na ciąg znaków w oknie Obserwowanie.
Oto kod, który zwraca błąd z kompilacji, która zakończyła się niepowodzeniem.
// 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
}
Tematy pokrewne