2

問題が何であるかをよりよく示すために、この最初の投稿を完全に書き直しました。

ps v1.4 (サポートしている最新バージョン) を使用していますが、エラーが発生し続けます。
ピクセルシェーダーに渡されたものに対して、cos、dot、distance、sqrt、normalize などの任意のタイプの関数を使用するたびに発生します。
たとえば、ピクセルシェーダでポイント ライトを使用するには「normalize(LightPosition - PixelPosition)」を実行する必要がありますが、正規化するとエラーが発生します。
注意す
べき点 - pow、abs、radians などをエラーなしで使用できます。
頂点シェーダーから渡されたものに対して実行された場合にのみ、エラーが発生します。(たとえば、ローカル ピクセルシェーダー変数の sqrt をエラーなし
で取得できます) 渡された任意の変数に対して関数を実行すると、テキストの座標、色などであってもエラーが発生します。
頂点シェーダー内では、エラーなしで渡された変数に対してこれらすべての関数を実行できます。エラーが発生するのは
ピクセルシェーダーだけです。頂点からピクセルシェーダーに渡されるすべての値は正しいです。ハードウェアよりもエラーがなく、完全に照らされたシーンが得られます。
ベクトルの正規化は基本的にエラーが発生する場所であるため、独自の正規化関数を作成してみました。
私は Norm(LightPosition - PixelPosition) を呼び出し、「Norm」は次のようになります -

float3 Norm(float3 v)
{
    return v / sqrt(dot(v, v));
}

技術的には、まだピクセルシェーダー内で sqrt を取得しようとしていると思われるため、まだエラーが発生します。

エラーは具体的なものではなく、C# で .fx ファイルをロードする行に「アプリケーションのエラー」と表示されているだけ
です。このような古いバージョンを使用する必要があるため、実際にはコンパイル エラーである可能性があると考えています (vs 1.1 ps 1.4)
fxc.exe を使用してデバッグすると、「命令をピクセル シェーダー命令セットにマップできません」と表示されます。

4

1 に答える 1

1

古い GPU: は、特にピクセル シェーダーで、常に命令をサポートしていませんでした。

頂点シェーダーで sqrt を使用することはできますが、非常に古いバージョン (1.1 !!) の場合、フラグメント シェーダーは非常に制限される可能性があります。

つまり、これはバグではないかもしれません。

回避策として、hlsl をスキップして独自のアセンブラを作成し (ただし、そこで同じ問題に遭遇する可能性があります)、sqrt をシミュレートします (たとえば、1.0 で 2 つのテクスチャを使用できる場合は、テクスチャ ルックアップおよび/または補間を使用します :-p )

もちろん、hlsl で sqrt-lookup/interpolation を記述しようとすることもできますが、大きすぎる可能性もあります (覚えていませんが、IIRC 1.1 では非常に長いシェーダーを記述できません)。

于 2011-11-22T12:33:37.827 に答える