【问题标题】:Pixel Shader model > 2.0 in FireMonkeyFireMonkey 中的像素着色器模型 > 2.0
【发布时间】:2012-04-27 06:42:38
【问题描述】:

从我的主要问题开始:

我可以在 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 或更高级别。

【问题讨论】:

  • +1,有趣的问题!我也有兴趣了解您如何编译和使用着色器。

标签: delphi delphi-xe2 shader firemonkey pixel-shader


【解决方案1】:

此答案在撰写本文时是正确的,但可能会随着 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 为您更改此设置。

【讨论】:

  • 我认为这是错误的。 DirectX 9.0c(从 2004 年开始)支持着色器模型 3.0。 SM2 带有最初的 DirectX9.0 版本,但 9.0c 已有 8 年历史,非常标准。 DirectX 10 引入了 SM4。我没有检查 Pascal 翻译,所以可能他们缺少有效的令牌,但这意味着如果 FMX 使用 DirectX 9,它肯定可以使用 SM3。
  • 你可能是对的。我可以肯定地说,Delphi 对 DX9 的翻译确实提供 ps_3_0 标志。我不完全确定 DirectX 9.0c 是否添加了 SM 3.0 和 PS 3.0,但 Delphi 的标头肯定没有。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多