Question

J'ai un simple effet de particules dans OpenGL en utilisant GL_POINTS. Ci-dessous est appelé, étant passé particules dans l'ordre de la plus éloignée des particules provenant de la caméra première à la plus proche de la caméra dernier:

void draw_particle(particle* part) {
    /* The following is how the distance is calculated when ordering.
     * GLfloat distance = sqrt(pow(get_camera_pos_x() - part->pos_x, 2) + pow(get_camera_pos_y() - part->pos_y, 2) + pow(get_camera_pos_z() - part->pos_z, 2));
     */

    static GLfloat quadratic[] = {0.005, 0.01, 1/600.0};
    glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic);
    glPointSize(part->size);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_POINT_SPRITE_ARB);
    glEnable(GL_TEXTURE_2D);

    glBegin(GL_POINTS);
        glColor4f(part->r, part->g, part->b, part->a);
        glVertex3f(part->pos_x, part->pos_y, part->pos_z);
    glEnd();

    glDisable(GL_BLEND);
    glDisable(GL_POINT_SPRITE_ARB);
}

Cependant, il y a un certain artifacting lors du rendu comme on le voit dans l'effet suivant: l'image artifacted http://img199.imageshack.us/img199/9574/particleeffect.png

Les problèmes disparaissent si je désactive le test de profondeur, mais je dois les effets pour être en mesure d'interagir avec d'autres éléments de la scène, apparaissant devant et derrière les éléments du même GL_TRIANGLE_STRIP en fonction de la profondeur.

Était-ce utile?

La solution

Si vos sont déjà triés particules vous pouvez rendre comme ceci:

  • Rendu avec PROFONDEUR GL particule d'écrire, mais pas de test de profondeur (je ne me souviens pas exactement les constantes)
  • Render le reste de la scène avec le test de profondeur.

De cette façon, vous êtes sûr d'obtenir une interaction de scène avec de jolies particules.

Autres conseils

Remarque: S'il vous plaît spécifier la version OpenGL que vous utilisez lorsque vous posez des questions. Cela vaut pour toute API. Lorsque vous voulez rendre primitives avec le mélange alpha, vous ne pouvez pas avoir écrit de profondeur activée. Vous devez dessiner vos primitives mélangés triés dos à l'avant. Si vous avez des objets opaques dans la scène, les rendre d'abord, puis dessinez vos primitives transparentes de façon triée dos à l'avant avec le test de profondeur activé et la profondeur écrit désactivée.

glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SPRITE);
glEnable(GL_CULL_FACE);

while(1)
{
    ...
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDisable(GL_BLEND);
    glDepthMask(1);
    RenderOpaque();
    SortSprites();
    glEnable(GL_BLEND);
    glDepthMask(0);
    DrawSprites();
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top