1

答えは前にあるべきだと思いました。しかし、私はこれと矛盾するように見えるシェーダーを持っています:

float4 vp(
        // Vertex Inputs
        in float4 position        : POSITION,
        uniform float4x4 worldViewProj) : TEXCOORD6
{
    float4 p = mul(worldViewProj, position);
    p.y /= 2.0;
    return p;
}

worldViewProjは、世界の位置を画面の座標に変換する結合された行列です。この頂点シェーダーが出力をレンダーターゲットの上半分に押しつぶすと予想しましたが、実際にこれを行いますが、ビューの下半分は、通常は表示されないより多くのジオメトリで埋められます。

これは単にGPUのカリングがかなり粗雑であるためですか?

4

2 に答える 2

1

カリングは、頂点ステージの後に発生します。

頂点シェーダーは、ジオメトリが実際に作成される段階です。それ以前は、ジオメトリは、頂点シェーダーが入力として受け取る任意のデータとしてのみ存在していました。頂点シェーダーが頂点を生成すると、錐台と面のカリング (背面または前面) が行われる場合があります。カリングは頂点ステージの前に発生するとは言いませんが、それ以前は実際のジオメトリではないためです (パイプラインの最初のステージの 1 つです)。

ピクセルの深度が補間されると、深度 (またはオクルージョン) のカリング (「カリング」の意味である可能性が最も高い) が、ピクセル シェーダーの直前に実行されます。

于 2011-11-27T10:21:15.573 に答える
1

最初に頂点シェーダー、次にクリッピングが続きます (完全な D3D10 パイプラインについては、 http: //download.microsoft.com/download/f/2/d/f2d5ee2c-b7ba-4cd0-9686-b6508b5479a1/direct3d10_web.pdf を参照してください)。

したがって、基本的に Vertex Shader ですべての頂点をスクリーンに投影し、スクリーン スペースで 0.5 ずつスケーリングします。このように変更された頂点はクリップされ、画面全体がジオメトリで埋め尽くされます。画面の半分が塗りつぶされ、画面の半分が空白になることを期待していたと思いますか?

于 2011-11-14T15:17:12.100 に答える