Модель пиксельных шейдеров > 2.0 в FireMonkey

Начну с моего основного вопроса:

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

11
задан Wouter van Nifterick 15 April 2012 в 20:04
поделиться