0

directx 11 を使用して、ジオメトリ シェーダーを使用してワールド空間でクワッドを構築するグラフィックス エフェクト システムに取り組んでいます。これらのクワッドは、メイン テクスチャがレンダリングされたシーン テクスチャであるフラグメント シェーダを使用します。qorld スペース クワッドでポスト プロセス エフェクトを効果的に生成します。最も単純なものは色合い効果です。

頂点シェーダーは、データをジオメトリ シェーダーに渡すだけです。

ジオメトリ シェーダーは、法線に基づいて追加の頂点を計算します。外積を使用して、x 軸と z 軸を見つけ、元の位置から各対角線方向に 4 つの新しい頂点を持つトライストリームを追加します (指定された位置とサイズからクワッドを生成します)。

ピクセル シェーダー (ティント効果) は、シーン テクスチャの色に色変数セットを乗算するだけです。

クワッドが生成され、画面に正しく表示されます。でも;

私が直面している問題は、UV 座標のマッピングがバック バッファーの画像と一致しないことです。つまり、指定された色としてハーフ アルファのティント シェーダーを使用すると、クワッドがカメラの方を向いていない限り、クワッドに表示された画像がバック バッファーの画像に完全にオーバーレイされないことがわかります。四角形の法線がカメラの y 軸と一致するほど、画像の歪みが大きくなります。

現在、以下の式を使用して UV 座標を計算しています。

    float2 uv = vert0.position.xy / vert0.position.w;
    vert0.uv.x =  uv.x * 0.5f + 0.5f;
    vert0.uv.y = -uv.y * 0.5f + 0.5f;

以下の式も使用しましたが、その結果、(IMO) uv が考慮に入れられませんでした。

    float2 uv = vert0.position.xy / SourceTextureResolution;
    vert0.uv.x =  uv.x * ASPECT_RATIO + 0.5f;
    vert0.uv.y = -uv.y + 0.5f;

質問: ジオメトリ シェーダーで生成された頂点位置に基づいてスクリーン スペースの UV 座標を取得するにはどうすればよいですか?

もし私にどんな点でも詳しく説明してほしいなら、尋ねてください、そして私は最善を尽くします:)

前もって感謝します。

4

0 に答える 0