从我的主要问题开始:
我可以在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或更高级别。
答案 0 :(得分:3)
在撰写本文时,这个答案是正确的,但可能会随着FireMonkey的发展而改变:
您无法使用PixelShader或ShaderModel 3.0或更高版本,因为FireMonkey(在Windows下)使用DirectX 9,而PixelShader / ShaderModel 3.0+是DirectX 10的功能。
如果您查看Winapi.D3DX9.pas
(第2871-2872行),则可以在ps_3_0
(第3224-3230行)中确认Winapi.D3DX10.pas
不是有效令牌得到支持。
因此,您可以使用PixelShader / ShaderModel 3.0+的唯一方法是自己修改FireMonkey以使用DirectX 10上下文,或者请求(在其他人的支持下)Embarcadero为您更改此内容。