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

从我的主要问题开始:

我可以在我的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不是一个有效的标记,而在Winapi.D3DX10.pas (行3224-3230)中它是受支持的。

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

链接地址: http://www.djcxy.com/p/60471.html

上一篇: Pixel Shader model > 2.0 in FireMonkey

下一篇: Firemonkey to iPhone