Модель пиксельного шейдерa> 2.0 в FireMonkey
Чтобы начать с моего основного вопроса:
Могу ли я использовать пиксельные шейдерные модели 3, 4 или 5 в приложениях FireMonkey?
Я хочу иметь возможность динамически создавать пиксельные шейдеры в моей программе FireMonkey.
Для этого я теперь скомпилирую пиксельный шейдер, используя fxc.exe, который поставляется с DirectX SDK, и загружаю скомпилированный код в потомка TShaderFilter. Это прекрасно работает (дайте мне знать, если вы заинтересованы в том, как я это делаю).
Однако я могу только заставить работать, если я компилирую с ps_2_0
в качестве целевого профиля.
В настоящее время я использую ограничения шейдерной модели 2.0. Например, циклы, по-видимому, разворачиваются компилятором, и существует максимальное количество инструкций, которые вы можете иметь в шейдерах уровня 2. Из-за этого количество возможностей довольно ограничено.
Пример:
Шейдерный код ниже создает фрактал mandelbrot. Если я установил слишком высокий уровень Iterations
, он не компилируется. Сообщение об ошибке:
error X5608: Compiled shader code uses too many arithmetic instruction slots (78). Max. allowed by the target (ps_2_0) is 64.
#define Iterations 12
float2 Pan;
float Zoom;
float Aspect;
float4 main(float2 texCoord : TEXCOORD0) : COLOR0
{
float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;
float2 v = 0;
for (int n = 0; n < Iterations; n++)
{
v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c;
}
return (dot(v, v) > 1) ? 1 : 0;
}
С шейдерной моделью ps_3_0 я могу скомпилировать с большим количеством итераций, но скомпилированный шейдер, похоже, не работает в FireMonkey. Я не получаю сообщение об ошибке; В результате я получаю только красное изображение.
Есть ли у кого-нибудь идеи о том, как обойти это, или FireMonkey просто не способен использовать весь потенциал моей видеокарты?
Примечание. Я видел, что минимальным требованием для FireMonkey является графическая карта с уровнем шейдера 2.0, но неясно, означает ли это, что вы не можете использовать уровень шейдера 3 или выше.
Ответы
Ответ 1
Этот ответ верен на момент написания, но, возможно, изменится по мере развития FireMonkey:
Вы не можете использовать PixelShader или ShaderModel версии 3.0 или выше, так как FireMonkey (под Windows) использует DirectX 9, а PixelShader/ShaderModel 3.0+ - это функции DirectX 10.
Если вы посмотрите в Winapi.D3DX9.pas
(строки 2871-2872), вы сможете подтвердить, что ps_3_0
здесь не является допустимым токеном, а в Winapi.D3DX10.pas
(строки 3224-3230) поддерживается.
Таким образом, единственный способ использования PixelShader/ShaderModel 3.0+ - либо самостоятельно изменить FireMonkey, либо использовать контекст DirectX 10, либо запросить (при поддержке других), что Embarcadero изменит это для вас.