Чтобы начать с моего основного вопроса:
Могу ли я использовать пиксельные шейдерные модели 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 или выше.