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