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

标签 delphi delphi-xe2 shader firemonkey pixel-shader

从我的主要问题开始:

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

我希望能够在我的 FireMonkey 程序中动态创建像素着色器。 为此,我现在使用 DirectX SDK 附带的 fxc.exe 编译像素着色器,并将编译后的代码加载到我的 TShaderFilter 后代中。效果很好(如果您对我如何做到这一点感兴趣,请告诉我)。

但是,只有使用 ps_2_0 作为目标配置文件进行编译,才能正常工作。

我目前遇到了着色器模型 2.0 的限制。例如,循环似乎是由编译器展开的,并且在 2 级着色器中可以拥有的指令数量有最大限制。因此,可能性的数量非常有限。

<小时/>

示例: 下面的着色器代码创建曼德尔布罗分形。如果我将迭代次数设置得太高,它就无法编译。错误信息:

错误 X5608:编译的着色器代码使用了太多算术指令槽 (78)。最大限度。目标(ps_2_0)允许的值为 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行)它受支持。

因此,您能够使用 PixelShader/ShaderModel 3.0+ 的唯一方法是自己修改 FireMonkey 以使用 DirectX 10 上下文,或者请求(在其他人的支持下)Embarcadero 为您更改此设置。

关于delphi - FireMonkey 中的像素着色器模型 > 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165598/

相关文章:

web-services - Delphi 中的 Web 服务超时错误

delphi - Firemonkey 项目中表单和单位之间的切换不起作用

delphi - CArdinal 不兼容类型错误 DelphiXE2

math - 将深度纹理样本转换为距离

opengl - 如何查询 SSBO 结构的对齐/步幅?

opengl - 如何使用 OpenGL 使用 GLSL 着色器将光度均匀地应用到头发颗粒上?

delphi - TControlClass 作为通用 TControl 参数?

delphi - Application.Restore 无法让我回到之前的位置,为什么?

json - Delphi Superobject,通用列表到 json

delphi - xe2 中的备忘录无法正确显示存储在 ansi 字符集中的元音变音字符