2010-12-04 28 views
2

Je suis en train de coder un simple jeu de course automobile. En essayant d'ajouter des ombres dans ma scène, en dessinant des polygones noirs transparents, je me suis retrouvé coincé dans un étrange problème. Quand les ombres sont dessinées sur des surfaces horizontales, quand je les regarde de loin, je peux voir à travers les surfaces comme si elles étaient transparentes.Les polygones transparents rendent également transparentes les surfaces sous-jacentes

void PolyShadow::Draw(){ 
glColor4f(0,0,0,0.5f); 
    glEnable (GL_BLEND); 
    glBlendFunc (GL_DST_COLOR,GL_ONE_MINUS_SRC_ALPHA); 

    this->drawShadow(); 
glDisable (GL_BLEND); 
    shadow_initialized = true; 
} 

Pour éviter les conflits i attribuons à un objet ombres projeter un autre shadow_offset et de faire cet appel avant de dessiner l'ombre

glEnable(GL_POLYGON_OFFSET_FILL); 

//call to object.drawShadows() 

glDisable(GL_POLYGON_OFFSET_FILL); 

Et

void Object::drawShadows(){ 
glPolygonOffset(-1.0-shadow_offset,-1.0-shadow_offset); 
//Draw shadow 
} 

J'ai aussi essayé avec

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

mais rien n'a changé.

Merci à l'avance

Répondre

1

Lorsque vous utilisez vous de mélange doivent rendre retour à l'avant. Vous avez donc besoin de z-commander vos modèles ou même des triangles. Habituellement, vous rendez tout d'abord toutes les données opaques dans un ordre arbitraire, puis vous mélangez les données de l'arrière-plan.

Puisque toutes les ombres ont la même couleur, ce n'est pas si mal pour vous. Rend simplement les ombres après avoir rendu la géométrie.
Il existe d'autres méthodes de rendu des ombres qui sont plus esthétiques et ne présentent pas ce problème (par exemple marking the shadowed parts of the geometry in the stencil buffer).

Il existe certaines techniques pour rendre des scènes alpha-compliquées compliquées (par exemple "Depth peeling") qui évitent le problème d'ordre et qui fonctionnent même pour la géométrie entrecroisée, mais elles sont plutôt coûteuses.

+0

Merci beaucoup! Je vais travailler dessus –