2015-03-09 1 views
0

Comment puis-je vérifier si le vertex est visible de la manière la plus simple?Vérifier la visibilité des sommets dans OpenGL ES 2.0

Si mon vertex shader ressemble:

void main(void) { 
    vec4 glPosition = vec4(VTPosition.x * VTAspectRatio, VTPosition.y, VTPosition.z, 1.0); 
    gl_Position = VTProjection * VTModelview * glPosition; 
} 

Puis-je vérifier la visibilité sur le processeur de la même façon?

Vector4 vertex = {0.5, 0.5, -1.0, 1.0}; 

vertex = projectionMatrix * modelViewMatrix * vertex; 

si le sommet x et la valeur y est dans la gamme -1,0 .. 1,0 (fenêtre coordonnées), il est visible

Répondre

0

La position de sortie du vertex shader (gl_Position) sera soumis à la division en perspective d'obtenir NDC (Coordonnées normalisées de l'appareil). Dans l'espace NDC, l'écrêtage est contre la plage [-1.0, 1.0] pour toutes les coordonnées (1). Pour tester si un sommet donné sera écrêté, vous devez déterminer si gl_Position.xyz/gl_Position.w est dans la plage [-1.0, 1.0] pour toutes les coordonnées. code GLSL pour tester cette condition pourrait ressembler à ceci:

if (any(lessThan(gl_Position.xyz, vec3(-gl_Position.w))) || 
    any(greaterThan(gl_Position.xyz, vec3(gl_Position.w)))) 
{ 
    // vertex will be clipped 
} 

(1) Au sens strict, découpage peut être effectué à différents points dans le pipeline de rendu, tant que la géométrie en dehors du volume de visualisation finit par être rognée. Mais c'est plus facile à exprimer dans NDC.