私の主な質問から始めます:
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 以上を使用できないことを意味するかどうかは明確ではありません。