2017-02-08 11 views
0

私はWebGLレンダラを持っています。ランダムなワールド座標をフラグメントシェーダのスクリーン座標に変換したいと思います。フラグメントシェーダのスクリーン位置をワールド位置にするglsl

これにより、「計算された画面座標」と現在の断片画面座標を比較することができます。

私はそうするために必要なすべての情報を持っています。私は信じています。そうする正しい方法がわからないだけです。

... 
    // available information: 

    // uCanvasWidth (float) 
    // uCanvasHeight (float) 
    // modelMatrix (mat4) 
    // modelViewMatrix (mat4) 
    // projectionMatrix (mat4) 
    vec4 someWorldCoordinates = vec4(1., 2., 3., 1.); 
    // map it to screen coordinates? 
    vec4 screenCoordinates = ??? 

    // compare to current fragment location 
    if(screenCoordinates.x > gl_FragCoord.x){ 
    // do stuff 
    } 
    ... 

答えて

1
vec4 worldSpace = vec4(1., 2., 3., 1.); 
// get homogeneous clip space coordinates 
vec4 clipSpace = projectionMatrix * (modelViewMatrix * worldCoords); 
// apply perspective divide to get normalized device coordinates 
vec3 ndc = clipSpace.xyz/clipSpace.w; 
// do viewport transform 
vec2 screenSpace = (ndc.xy * .5 + .5) * vec2(uCanvasWidth, uCanvasHeight); 
screenSpace.y = uCanvasHeight - screenSpace.y; 

あなたmodelView行列の可能性が高いあなたがレンダリングしているモデルのを変換含まれていることに注意してください。私は、シェーダで指定されたポイントは、レンダリングしようとしているモデルとは関係なく、すでに "final"のワールドスペースであると考えられますので、ここでviewマトリックスを使用することをお勧めします(予め乗算されたviewProjection)。

+1

これは逆の 'screenSpace.y'を与えると思います。 –

+0

これは忘れていて、固定しています:) –

+1

これは 'screenSpace =(ndx.xy * .5 + .5)* vec2(viewportWidth、viewportIHeight)+ vec2(viewportLeft、viewportRight); – gman

関連する問題