FireMonkey中的像素着色器模型> 2.0

11

首先让我提出我的主要问题:

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

我想在我的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;
}

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


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

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


3
+1,有趣的问题!我很想知道您是如何编写和使用着色器的。 - David
1个回答

3

本答案在撰写时是正确的,但随着FireMonkey的发展可能会有所改变:

由于FireMonkey(在Windows下)使用DirectX 9,而PixelShader/ShaderModel 3.0+是DirectX 10的功能,因此您不能使用PixelShader或ShaderModel 3.0或更高版本。如果您查看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已经八年了,非常标准。DirectX 10引入了SM4。我没有检查过Pascal的翻译,所以也许它们缺少一个有效的令牌,但这意味着如果FMX使用DirectX 9,它肯定能够使用SM3。 - David
你可能是对的。我可以肯定地说,Delphi对DX9的翻译提供ps_3_0标志。我不确定DirectX 9.0c是否添加了SM 3.0和PS 3.0,但Delphi的头文件肯定没有。 - LaKraven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接