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 pierwszym krokiem jest skompilowanie kodu w celu sprawdzenia problemów ze składnią. Odbywa się to przez wywołanie jednego z interfejsów API kompilacji (na przykład D3DX10CompileEffectFromFile, D3DX10CompileEffectFromResource, D3DX10CompileEffectFromMemory). Te interfejsy API wywołują kompilator efektów fxc.exe który jest kompilatorem używanym do kompilowania kodu HLSL. Dlatego składnia kodu w efekcie wygląda bardzo podobnie do kodu HLSL (istnieje kilka wyjątków, które będą obsługiwane później). Dzięki temu kompilator efektu/kompilator hlsl (fxc.exe) znajduje się w zestawie SDK w folderze narzędzi, aby można było skompilować cieniowanie (lub efekty) w trybie offline, jeśli wybierzesz. Zapoznaj się z dokumentacją dotyczącą uruchamiania kompilatora z wiersza polecenia.
Oto przykład kompilowania pliku efektu (z przykładu 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 );
Zawiera
Jeden parametr jest interfejsem dołączania. Wygeneruj jeden z tych elementów, jeśli chcesz uwzględnić dostosowane zachowanie podczas odczytywania pliku dołączania. To zachowanie niestandardowe jest wykonywane za każdym razem, gdy jest tworzony efekt (używający wskaźnika dołączania) lub gdy zostanie skompilowany efekt (używający wskaźnika dołączania). Aby zaimplementować dostosowane zachowanie dołączania, należy utworzyć klasę z interfejsu Dołączanie. Zapewnia to dwie metody klasy: Otwórz i Zamknij. Zaimplementuj zachowanie niestandardowe w metodach Otwórz i Zamknij.
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.
D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
Makra są tablicą makr zakończonych wartością NULL; gdzie każde makro jest definiowane za pomocą struktury D3D_SHADER_MACRO.
Na koniec zmodyfikuj wywołanie efektu kompilacji, aby przejąć wskaźnik do makr.
D3DX10CreateEffectFromFile( str, Shader_Macros, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&g_pEffect10, NULL );
Flagi cieniowania HLSL
Flagi cieniowania określają ograniczenia cieniowania kompilatora HLSL. Te flagi wpływają na kod wygenerowany przez kompilator cieniowania, w tym:
- Zagadnienia dotyczące rozmiaru: optymalizowanie kodu.
- Zagadnienia dotyczące debugowania: w tym informacje o debugowaniu, uniemożliwiając sterowanie przepływem.
- Zagadnienia dotyczące sprzętu: element docelowy kompilacji i to, czy moduł cieniowania może działać na starszym sprzęcie.
Ogólnie rzecz biorąc, te flagi można logicznie łączyć, zakładając, że nie określono dwóch cech powodujących konflikt. Aby uzyskać listę flag, zobacz Stałe efektu (Direct3D 10).
Flagi FX
Te flagi używane podczas tworzenia efektu w celu zdefiniowania zachowania kompilacji lub zachowania efektu środowiska uruchomieniowego. Aby uzyskać listę flag, zobacz Stałe efektu (Direct3D 10).
Sprawdzanie błędów
Jeśli podczas kompilacji wystąpi błąd, interfejs API zwraca interfejs zawierający błędy zwrócone z kompilatora efektu. Ten interfejs nosi nazwę ID3D10Blob. Nie można go jednak bezpośrednio odczytać, zwracając wskaźnik do buforu zawierającego dane (czyli ciąg), można zobaczyć błędy kompilacji.
W tym przykładzie wprowadzono błąd w efekcie BasicHLSL.fx przez dwukrotne skopiowanie pierwszej deklaracji zmiennej.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Ten błąd spowodował, że kompilator zwrócił następujący błąd, jak pokazano na poniższym zrzucie ekranu okna zegarka w programie Microsoft Visual Studio.
Ponieważ błąd jest zwracany w wskaźniku LPVOID, rzutuj go na ciąg znaków w oknie zegarka.
Oto kod używany do zwracania błędu z kompilacji, która zakończyła się niepowodzeniem.
// 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
}
Tematy pokrewne