Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После создания эффекта первым шагом является компиляция кода для проверки проблем синтаксиса. Это делается путем вызова одного из API компиляции (например, D3DX10CompileEffectFromFile, D3DX10CompileEffectFromResource, D3DX10CompileEffectFromMemory). Этот API вызывает компилятор эффекта fxc.exe который является компилятором, используемым для компиляции кода HLSL. Именно поэтому синтаксис кода в эффекте выглядит очень похоже на код HLSL (есть несколько исключений, которые будут обрабатываться позже). Кстати, компилятор эффекта или компилятор hlsl (fxc.exe) находится в пакете SDK в папке служебных программ, чтобы вы могли скомпилировать шейдеры (или эффекты) в автономном режиме при выборе. См. документацию по запуску компилятора из командной строки.
Ниже приведен пример компиляции файла эффекта (из примера 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 );
Включает
Один из параметров — это интерфейс включения. Создайте одно из них, если вы хотите включить настраиваемое поведение при чтении файла включения. Это настраиваемое поведение выполняется при каждом создании эффекта (который использует указатель включения) или при компиляции эффекта (который использует указатель включения). Чтобы реализовать настраиваемое поведение включения, наследуйте класс из интерфейса Include. Это обеспечивает два метода класса: Open и Close. Реализуйте пользовательское поведение в методах Open and Close.
Макросы
Компиляция эффектов также может принимать указатель на макросы, определенные в другом месте. Например, предположим, что необходимо изменить эффект в BasicHLSL10, чтобы использовать два макроса: ноль и один. Код эффекта, использующий два макроса, показан здесь.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Ниже приведено объявление для двух макросов.
D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
Макросы — это прерванный массив макросов с прерванным значением NULL; где каждый макрос определен с помощью структуры D3D_SHADER_MACRO.
Наконец, измените вызов эффекта компиляции, чтобы он указывал на макросы.
D3DX10CreateEffectFromFile( str, Shader_Macros, NULL,
D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL,
&g_pEffect10, NULL );
Флаги шейдера HLSL
Флаги шейдера указывают ограничения шейдера компилятору HLSL. Эти флаги влияют на код, созданный компилятором шейдера, включая:
- Рекомендации по размеру: оптимизация кода.
- Рекомендации по отладке: включая сведения об отладке, предотвращение управления потоком.
- Рекомендации по оборудованию: целевой объект компиляции и может ли шейдер работать на устаревшем оборудовании.
Как правило, эти флаги можно логически объединить, если вы не указали две конфликтующие характеристики. Список флагов см. в константы эффектов (Direct3D 10).
Флаги FX
Эти флаги используются при создании эффекта для определения поведения компиляции или поведения эффекта среды выполнения. Список флагов см. в константы эффектов (Direct3D 10).
Проверка ошибок
Если во время компиляции возникает ошибка, API возвращает интерфейс, содержащий ошибки, возвращаемые компилятором эффектов. Этот интерфейс называется ID3D10Blob. Однако он недоступен для чтения, возвращая указатель на буфер, содержащий данные (это строка), можно увидеть любые ошибки компиляции.
В этом примере ошибка была введена в эффект BasicHLSL.fx путем копирования первого объявления переменной дважды.
//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
// Declare the same variable twice
float4 g_MaterialAmbientColor; // Material's ambient color
Эта ошибка привела компилятора к возврату следующей ошибки, как показано на следующем снимке экрана окна просмотра в Microsoft Visual Studio.
Так как ошибка возвращается в указателе LPVOID, приведение его к символьной строке в окне просмотра.
Ниже приведен код, используемый для возврата ошибки из неудачной компиляции.
// 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
}
Связанные разделы