2

私のフラグメントシェーダーでは、これら2つのステートメントが同じ出力を提供することがわかりました。

// #1
// pos is set from gl_Position in vertex shader   
highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0; 

// #2 - equivalent?
highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;

これが正しければ、数学を説明していただけますか?私が思いついたのは#2ですが、論文で#1を見ました。これはNDC(正規化されたデバイス座標)の計算ですか?

コンテキストは、ビューポートと同じサイズのFBOでテクスチャ座標を使用しているということです。それはすべて機能していますが、数学を理解したいと思います。

頂点シェーダーの関連部分:

attribute vec4 position;
uniform mat4 modelViewProjectionMatrix;
varying lowp vec4 vColor;
// transformed position
varying highp vec4 pos;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;

    // for fragment shader
    pos = gl_Position;
    vColor = aColor;
}

フラグメントシェーダーの関連部分:

// transformed position - from vsh
varying highp vec4 pos;
// viewport dimensions
uniform highp vec2 uWinDims;

void main()
{
    highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0; 

    // equivalent?
    highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;

...

}
4

1 に答える 1

5

(pos.xy / pos.w)は、正規化されたデバイス座標(NDC)の座標値です。この値の範囲は、各次元で-1から1です。

(NDC + 1.0)/2.0範囲をから(-1 to 1)に変更します(0 to 1)(画面の左側が0、右側が1、上/下も同様)。

または、gl_FragCoordは座標をピクセル単位で指定するため、範囲はと(0 to width)です(0 to height)

この値を幅と高さ(uWinDims)で割ると、画面の左側の0から右側の1までの位置が再び得られます。

そうです、それらは同等であるように見えます。

于 2012-07-26T07:33:16.350 に答える