从我的主要问题开始:
我可以在 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;
}
使用着色器模型 ps_3_0 我可以编译更多迭代,但编译后的着色器似乎在 FireMonkey 中不起作用。我没有收到任何错误消息;结果,我得到了一张红色的图像。
这里有人知道如何解决这个问题,还是 FireMonkey 无法充分利用我的显卡的全部潜力?
请注意,我已经看到 FireMonkey 的最低要求是具有着色器级别 2.0 的显卡,但不清楚这是否意味着您不能使用着色器级别 3 或更高级别。