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 以上を使用できないことを意味するかどうかは明確ではありません。

4

1 に答える 1

3

この回答は執筆時点では正しいですが、FireMonkey が開発されるにつれて変更される可能性があります。

FireMonkey (Windows 環境) は DirectX 9 を使用するため、PixelShader または ShaderModel 3.0 以降は使用できませんが、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 にこれを変更するように (他の人の支持を得て) 要求することです。

于 2012-04-27T17:25:10.347 に答える