0

ビットマップを表示するために単純な頂点シェーダーを実装しています。4 つの頂点が定義され、各頂点シェーダーは、ビットマップの幅/高さをビューポートの幅/高さで割ったものと組み合わせて、それぞれの UV を使用して、クリップ空間の位置を変更します。かなり典型的なものです。そのためのスタブコードを次に示します。

    // Project positions to clip space.
    float4 clipPosition = vertexPosition * objectToClipSpaceTransform;

    // Get constants.
    float2 viewPort = float2(props[0], props[1]);
    float2 spriteSize = float2(props[2], props[3]);

    // Calculate window offset.
    float2 windowOffset;
    windowOffset.x = (vertexUV.x - 0.5) * spriteSize.x;
    //neg because V increases down, but Y in clip-space increases up
    windowOffset.y = -(vertexUV.y - 0.5) * spriteSize.y;  
    windowOffset /= viewPort;

    clipPosition.xy += windowOffset * clipPosition.w * 2.0;

    // Output shifted vertex.
    vertexClipPosition = clipPosition;

私がやりたいことは、大きさが固定数のピクセルであるワールド空間で定義されたベクトルの方向にビットマップをオフセットすることです。ここで難しいのは、ワールド空間ベクトルをクリップ空間に変換する方法です。翻訳コンポーネントなしで objectToClipSpaceTransform を使用しようとしましたが、結果が正しくありません。それで、どうすればいいですか?

4

1 に答える 1

1

ワールド空間ベクトルをクリップ空間に変換するには、worldViewProjection 変換を掛けて、最終的なベクトルを w コンポーネントで割ります。

0 は方向ベクトルに使用され、1 は位置ベクトルに使用されるため、元のベクトルの 4 番目のコンポーネントが 0 であることを確認することが重要です。

したがって、ベクトルが v = (x,y,z,0) の場合

次に(行主行列を仮定して)結果のベクトルは

vclip = v * worldViewProjection.

最後のステップは同次分割と呼ばれ、射影が遠近法である場合に重要です。新しいベクトルを 4 番目のコンポーネントで割る必要があります。つまり、次のようになります。

vclip = vclip / vclip.w; 
于 2013-02-14T19:38:35.417 に答える