Начну с моего основного вопроса:
Могу ли я использовать модели пиксельных шейдеров 3, 4 или 5 в своих приложениях FireMonkey?
Я хочу иметь возможность динамически создавать пиксельные шейдеры в моей программе FireMonkey. Для этого я теперь компилирую пиксельный шейдер, используя fxc.exe, который поставляется с DirectX SDK, и загружаю скомпилированный код в мой потомок TShaderFilter. Это прекрасно работает (дайте мне знать, если вам интересно, как я это делаю).
Однако я могу заставить все работать, только если я компилирую с ps_2_0
в качестве целевого профиля.
В настоящее время я сталкиваюсь с ограничениями модели шейдеров 2.0. Например, кажется, что циклы разворачиваются компилятором, и в шейдерах уровня 2 есть максимальное количество инструкций, которые вы можете иметь. Из-за этого количество возможностей довольно ограничено.
Пример:
Приведенный ниже код шейдера создает фрактал Мандельброта. Если я установлю Iterations
слишком большим, он не скомпилируется. Сообщение об ошибке:
error X5608: Скомпилированный код шейдера использует слишком много слотов для арифметических инструкций (78). Максимум. разрешенное целью (ps_2_0) равно 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 или выше.