2017-02-08 3 views
0

J'ai un moteur de rendu WebGL et je souhaite transformer les coordonnées du monde aléatoire en coordonnées d'écran dans les fragments fragmentés.Position du monde pour positionner l'écran dans le fragment shader glsl

Cela me permettra de comparer les "coordonnées d'écran calculées" aux coordonnées d'écran du fragment actuel.

J'ai toutes les informations nécessaires pour le faire, je crois, mais je ne sais pas quelle est la bonne façon de le faire.

... 
    // 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 
    } 
    ... 

Répondre

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; 

Notez que votre matrice modelView contient probablement le transforme du modèle que vous rendu. Je suppose que les points spécifiés dans le shader sont supposés être déjà "final" l'espace du monde (comme dans non par rapport au modèle que vous êtes en train de rendre), donc vous pouvez utiliser seulement la matrice view ici (de préférence prémultiplié viewProjection).

+1

Je pense que cela vous donnera un 'screenSpace.y' inversé. –

+0

Oui, vous avez raison, oublié à ce sujet, corrigé :) –

+1

devrait-il être 'screenSpace = (ndx.xy * .5 + 0,5) * vec2 (viewportWidth, viewportIHeight) + vec2 (viewportLeft, viewportRight);'? – gman