首先从我的主要问题开始:
我可以在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或更高级别。
最佳答案
此答案在撰写本文时是正确的,但可能会随着FireMonkey的发展而改变:
您不能使用PixelShader或ShaderModel 3.0或更高版本,因为FireMonkey(在Windows下)使用DirectX 9,而PixelShader/ShaderModel 3.0+是DirectX 10的功能。
如果您查看Winapi.D3DX9.pas
(第2871-2872行),则可以在此处确认ps_3_0
不是有效的 token ,而在Winapi.D3DX10.pas
(第3224-3230行)中则支持该 token 。
因此,您能够使用PixelShader/ShaderModel 3.0+的唯一方法是自己修改FireMonkey以使用DirectX 10上下文,或者(在其他人的支持下)请求Embarcadero为您更改此设置。
关于delphi - 在FireMonkey中> 2.0的Pixel Shader模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10165598/