Frage

Ich habe einen einfachen Partikeleffekt in OpenGL GL_POINTS. Die folgende genannt wird, um Teilchen von dem Teilchen am weitesten von der Kamera zuerst letzten nächsten zu der Kamera zu dem einen übergeben wird:

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);
}

Es gibt jedoch einige Artefakte beim Rendern wie im folgenden Effekt zu sehen ist: artifacted Bild http://img199.imageshack.us/img199/9574/particleeffect.png

Die Probleme gehen weg, wenn ich eine gründlichere Prüfung zu deaktivieren, aber ich brauche, um die Auswirkungen der Lage sein, mit anderen Elementen der Szene zu kommunizieren, sich vor und hinter Elementen derselben GL_TRIANGLE_STRIP je nach Tiefe erscheinen.

War es hilfreich?

Lösung

Wenn Ihr particules bereits sortiert sind Sie so machen kann:

  • Render particule mit GL WRITE TIEFER, aber keine Tiefen Prüfung (ich weiß nicht mehr genau die Konstanten)
  • Render den Rest der Szene mit Tiefentest.

Auf diese Weise sind Sie sicher, Szene Interaktion mit gut aussehenden particules zu erhalten.

Andere Tipps

Hinweis: Bitte angeben, welche OpenGL-Version Sie verwenden, wenn Sie Fragen stellen. Das gilt für jede API. Wenn Sie Primitiven mit Alpha-Blending machen möchten, können Sie nicht Tiefe schreibt aktiviert haben. Sie benötigen eine gemischte Grundelemente aus Back-to-Front sortiert. Wenn Sie undurchsichtige Objekte in der Szene haben, macht sie zuerst, und dann transparente Primitiven in einer Back-to-Front sortierte Art und Weise mit Tiefentest zeichnen aktiviert und Tiefe schreibt deaktiviert.

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();
    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top