4

DirectXですべてのMSチュートリアルを実行していると、それらが常にワールド、ビュー、およびプロジェクションマトリックスをテクニックに渡し、頂点シェーダーでそれらを乗算していることに気付きました。

描画する前に行列を乗算してから、単一のWVP行列をシェーダーに渡すのではなく、それを行う理由はありますか?このように、行列は頂点ごとに1回ではなく、フレームごとに1回乗算されます。

前もって感謝します。

編集:サンプルコードで更新

MSチュートリアル:

matrix World;
matrix View;
matrix Projection;

struct VS_INPUT
{
    float4 Pos : POSITION;
    float4 Color : COLOR;
};

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
};

PS_INPUT VS( VS_INPUT input )
{
    VS_OUTPUT output;
    output.Pos = mul( input.Pos, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    output.Color = input.Color;

    return output;
}

なぜこのようにしないのですか?

matrix WVP;

struct VS_INPUT
{
    float4 Pos : POSITION;
    float4 Color : COLOR;
};

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
};

PS_INPUT VS( VS_INPUT input )
{
    VS_OUTPUT output;
    output.Pos = mul( input.Pos, WVP );  
    output.Color = input.Color;

    return output;
}
4

4 に答える 4

5

この例では、世界、ビュー、および射影行列を事前に乗算するという提案は理にかなっていて、より効率的です。この単純な例では、チュートリアルでそれらを分けている理由がわかりません。

場合によっては、それらを別々にしておくことが理にかなっています (または、ワールド マトリックスを別々にして、結合されたビュー投影マトリックスを持ちます)。たとえば、頂点シェーダーでワールド空間の頂点位置にアクセスしたい場合など、オブジェクト空間ではなくワールド空間でライティングを行いたい場合があります。ある種のインスタンス化を行っている場合は、DeadMG で指摘されているように、ワールド スペース マトリックスを分離したままにしておくことをお勧めします。多くの場合、あなたが提案するようにそれらを組み合わせたいと思うでしょう。

于 2012-11-24T00:58:39.830 に答える
3

オブジェクトごとに World マトリックスが変化するためです。WVP マトリックスをシェーダーに渡すと、再描画するたびにそのマトリックスを変更する必要があり、非常に非効率的であり、CPU でそれを乗算することになり、これも非常に遅くなります。一方、すべてのワールド マトリックスをハードウェア インスタンシング バッファーで一度に GPU に送信し、GPU でそれらをすべて乗算することができます。これは、最新の GPU の規模では実際には何もないため、1 つの Draw を発行します。電話。

つまり、ハードウェアのインスタンス化を追加すると、シェーダーで行う方がはるかに効率的です。

于 2012-11-22T23:56:40.140 に答える
0

この方法では、行列は頂点ごとではなく、フレームごとに 1 回乗算されますよね?

「フレームごと」という用語はここでは意味がありません。なぜ頂点シェーダーと呼ぶのでしょうか? これは頂点ごとのプロセスであるため、3 つのマトリックスを乗算して単一のマトリックスにする場所 (シェーダーの外側または内側) に関係なく、各頂点は描画前にこの単一のマトリックスに適用する必要があります。GPU は、ベクトル/行列計算やその他のグラフィックス処理などのタスクに適しています。

于 2012-11-23T01:11:01.953 に答える
0

各マトリックスはフレームごとに変更できると思います。一部の人が同じように表示しない限り、カメラ ビューを別の角度または座標に配置して世界/オブジェクトを観察すると、ビューが変わる可能性があります。

于 2012-11-22T23:51:42.347 に答える