Frage

A eine Frage hat, vielleicht kann mir jemand helfen. Ich versuche, einen Spiegeleffekt mit Hilfe von OpenGL zu machen. Ich ziehe eine transparente Fläche, eine „reflektierte“ Szene durch Schablonen geschnitten und ein Original. Aber ich habe eine völlig nicht-transparent „Wand“ statt den Spiegel. Ich weiß, dass es wegen der ersten Spiegelebene Rendering geschieht (einen Schablonenpuffer zu bekommen). Aber ich weiß nicht, was damit zu tun :( Hier ist der Code:

  void CMirror::draw(CSceneObject * curscene)
{
    glPushMatrix();
    glClearStencil(0.0f);

    glClear(GL_STENCIL_BUFFER_BIT);
    //Draw into the stencil buffer
    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);
    glStencilFunc(GL_ALWAYS, 1, 0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glEnable(GL_STENCIL_TEST);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    glScalef(this->size, this->size, this->size);
    glColor4f(1, 0, 1, 0);
    glBegin(GL_QUADS);
        glVertex3f(0.0f, this->height / 2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / -2.0f);
        glVertex3f(0.0f, this->height / 2.0f, this->width / -2.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_STENCIL_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    //glClear(GL_COLOR_BUFFER_BIT);
    //Draw the scene
    glEnable(GL_STENCIL_TEST);  
    glStencilFunc(GL_EQUAL, 1, 255);
    glPushMatrix();
    glTranslatef( 2*this->coords[0], 2*this->coords[1], 2*this->coords[2]);
    glScalef(-1.0f, 1.0f, 1.0f);
    ((CScene*)curscene)->draw();
    glColor4f(0.0f, 0.30f, 0, 0.9); 
    ((CScene*)curscene)->spline->draw();
    ((CScene*)curscene)->morph->draw();


    glPopMatrix();
    glDisable(GL_STENCIL_TEST);
    //the mirror itself:
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    glScalef(this->size, this->size, this->size);
    glColor4f(0, 0, 0, 0.9);
    glBegin(GL_QUADS);
        glVertex3f(0.0f, this->height / 2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / -2.0f);
        glVertex3f(0.0f, this->height / 2.0f, this->width / -2.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_BLEND);

    glPopMatrix();
}
War es hilfreich?

Lösung

Was passiert, wenn Sie das nicht tun, dass letztes Unentschieden (das heißt, wenn das Problem weiterhin besteht, entfernen Sie es, wie es das Beispiel kompliziert)?

Eine Sache, die klar ist, dass Sie scheinen nichts Z-Puffer mit Bezug zu behandeln.

Wenn Sie Ihre erste Quad ziehen, um die Schablone zu setzen, unter der Annahme, Z-Schreibeingeschaltet ist, können Sie am Ende der Einstellung der Z-Werte an Spiegel Z. die Szene Zeichnung, die angeblich reflektiert wird in dem Spiegel wird Z- abgelehnt.

Sie müssen irgendwie den Z-Puffer für diesen Bereich des Bildschirms löschen. Offensichtlich kann eine vollständige Clear(DEPTH_BIT) arbeiten, aber es hängt davon ab, was Sie auf Ihrem Bildschirm bereits gezeichnet haben.

Ebenso nicht den Z-Puffer aktualisiert, wenn die Schablone Aktualisierung arbeiten kann, je nachdem, ob dort etwas vor gezogen wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top