2011-01-15 3 views
1

j'ai fait un peu d'ombrage simple GLSL d'une carte de dames:GLSL - avant vs faces arrière des polygones

f(P) = [ floor(Px)+floor(Py)+floor(Pz) ] mod 2 

Il semble bien fonctionner, sauf le fait que je vois l'intérieur des objets, mais je veux pour voir seulement la face avant. Des idées pour résoudre ce problème? Merci!

Teapot (glutSolidTeapot()): alt text

Cube (glutSolidCube): alt text

Le fichier vertex shader est:

varying float x,y,z; 
void main(){ 
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; 
    x = gl_Position.x; 
    y = gl_Position.y; 
    z = gl_Position.z; 
} 

Et le fichier shader fragment est:

varying float x,y,z; 
void main(){  
    float _x=x; 
    float _y=y; 
    float _z=z; 

    _x=floor(_x); 
    _y=floor(_y); 
    _z=floor(_z); 

    float sum = (_x+_y+_z); 
    sum = mod(sum,2.0); 
    gl_FragColor = vec4(sum,sum,sum,1.0); 
} 

Répondre

5

Les shaders ne sont pas le problème - l'abattage de visage est.

Vous devez soit désactiver le culling visage (qui n'est pas recommandé, car il est mauvais pour des raisons de performance):

glDisable(GL_CULL_FACE); 

ou utilisez glCullFace et glFrontFace pour régler le mode d'abattage sélectif, à savoir:

glEnable(GL_CULL_FACE); // enables face culling  
glCullFace(GL_BACK); // tells OpenGL to cull back faces (the sane default setting) 
glFrontFace(GL_CW); // tells OpenGL which faces are considered 'front' (use GL_CW or GL_CCW) 

L'argument de glFrontFace dépend des conventions d'application, c'est-à-dire de la passivité de la matrice.