FireMonkey中的Pixel Shader模型> 2.0

Wou*_*ick 11 delphi shader pixel-shader delphi-xe2 firemonkey

从我的主要问题开始:

我可以在FireMonkey应用程序中使用像素着色器模型3,4或5吗?

我希望能够在我的FireMonkey程序中动态创建像素着色器.为此,我现在使用DirectX SDK附带的fxc.exe编译像素着色器,并将编译后的代码加载到我的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;
}
Run Code Online (Sandbox Code Playgroud)

使用着色器模型ps_3_0我可以使用更多迭代进行编译,但编译的着色器似乎在FireMonkey中不起作用.我没有收到任何错误消息; 结果我得到一个红色图像.


这里有没有人知道如何解决这个问题,或者FireMonkey是否无法充分利用我的显卡的潜力?

注意,我已经看到FireMonkey的最低要求是具有着色器级别2.0的图形卡,但是不清楚这是否意味着您不能使用着色器级别3或更高级别.

LaK*_*ven 3

这个答案在撰写本文时是正确的,但随着 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 为您更改此设置。