2012-04-15 86 views
11

2.0要开始与我的主要问题:像素着色器模型>在FireMonkey

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

我希望能够在我的FireMonkey程序中动态创建像素着色器。 为此,我现在使用DirectX SDK附带的fxc.exe编译像素着色器,并将编译的代码加载到我的TShaderFilter后代中。这工作正常(让我知道如果你对我是如何做到这一点感兴趣的话)。

但是,如果我使用ps_2_0作为目标配置文件进行编译,我只能使其工作。

我目前遇到着色器模型2.0的限制。例如,循环似乎被编译器展开,并且您可以在2级着色器中使用最多数量的指令。因此,可能性的数量相当有限。


实施例: 下面的着色器代码创建一个曼德尔布罗分形。如果我设置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; 
} 

的Shader Model ps_3_0我可以用更多的迭代编译,但编译着色器似乎并不FireMonkey工作。我没有收到任何错误消息;结果我只是得到一张红色的图像。


是否有人在这里有关于如何解决这个问题的任何想法,或者是FireMonkey只是不能够利用我的显卡的全部潜能?

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

+3

+1,有趣的问题!我也有兴趣阅读你如何编译和使用着色器。 – 2012-04-16 09:05:52

回答

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为你改变它。

+1

我认为这是错误的。 DirectX 9.0c(从2004年起)支持着色器模型3.0。 SM2附带了原始的DirectX9.0版本,但9.0c已经有8年的历史,并且非常标准。 DirectX 10引入了SM4。我没有检查Pascal翻译,所以也许他们错过了一个有效的标记,但这意味着如果FMX使用DirectX 9,它肯定能够使用SM3。 – 2012-05-14 09:37:36

+0

你可能是对的。我可以肯定地说,Delphi的DX9转换不*提供ps_3_0标志。我不完全确定DirectX 9.0c是否添加了SM 3.0和PS 3.0,但Delphi的头文件肯定不会。 – LaKraven 2012-05-17 17:12:07