OpenGL - Würfel durchsichtig



  • Hallo,

    ich bin gerade dabei OpenGL mit GLut zu lernen habe aber noch nicht so viel Erfolg. Wenn ich den folgenden Code ausführe bekomme ich einen sich drehen Würfel, komischerweise sind jedoch die Seiten durchsichtig.

    #include <GL/glut.h>
    
    void changeSize(int w, int h) {
        if (h == 0)
            h = 1;
        float ratio =  w * 1.0 / h;
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glViewport(0, 0, w, h);
        gluPerspective(45.0f, ratio, 0.1f, 100.0f);
        glMatrixMode(GL_MODELVIEW);
    }
    
    float angle = 0.0f;
    
    void renderScene(void) {
    
        // Clear Color and Depth Buffers
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        gluLookAt(0.0f, 0.0f, 10.0f, 0.0f, 0.0f,  0.0f, 0.0f, 1.0f,  0.0f);
    
        glRotatef(angle,1,1,0);
    
    		glBegin(GL_QUADS);
            //Vorne
            glColor3f(1, 0, 0);
            glVertex3f(0,0,0);
            glVertex3f(1,0,0);
            glVertex3f(1,1,0);
            glVertex3f(0,1,0);
        glEnd();
    
        glBegin(GL_QUADS);
            //Hinten
            glColor3f(0, 1, 0);
            glVertex3f(0,0,-1);
            glVertex3f(1,0,-1);
            glVertex3f(1,1,-1);
            glVertex3f(0,1,-1);
        glEnd();
    
        glBegin(GL_QUADS);
            //rechts
            glColor3f(0, 0, 1);
            glVertex3f(1,0,0);
            glVertex3f(1,0,-1);
            glVertex3f(1,1,-1);
            glVertex3f(1,1,0);
        glEnd();
    
        glBegin(GL_QUADS);
            //Links
            glColor3f(1, 1, 0);
            glVertex3f(0,0,0);
            glVertex3f(0,0,-1);
            glVertex3f(0,1,-1);
            glVertex3f(0,1,0);
        glEnd();
    
        glBegin(GL_QUADS);
            //Oben
            glColor3f(0, 0.5, 1);
            glVertex3f(0,1,0);
            glVertex3f(1,1,0);
            glVertex3f(1,1,-1);
            glVertex3f(0,1,-1);
        glEnd();
    
        glBegin(GL_QUADS);
            //Unten
            glColor3f(1, 0.1, 0.8);
            glVertex3f(0,0,0);
            glVertex3f(1,0,0);
            glVertex3f(1,0,-1);
            glVertex3f(0,0,-1);
        glEnd();
    
        angle+=0.01f;
    
        glutSwapBuffers();
    }
    
    int main(int argc, char **argv) {
    
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA | GLUT_MULTISAMPLE);
        glutInitWindowPosition(100,100);
        glutInitWindowSize(800,800);
        glutCreateWindow("Test");
    
        glutDisplayFunc(renderScene);
        glutReshapeFunc(changeSize);
        glutIdleFunc(renderScene);
    
        glutMainLoop();
    }
    

    Ich hoffe mir kann hier geholfen werden (-:

    Und falls noch jemand gute Tutorials kennt, gerne her damit!!

    MFG Bastian



  • @durchsichtig
    Füge mal glDisable(GL_BLEND) ein und setze glClearColor(0,0,0,1).

    @code
    glBegin und glEnd sind hoffnungslos veraltet seit Jahren.
    Besseres Tutorial:
    http://arcsynthesis.org/gltut/



  • Zeig bitte mal einen Screenshot von dem Fehler.



  • Danke für die Antworten 👍

    @Scorcher24: deine beiden Tipps haben leider keinerlei Änderung gezeigt. Das Tutorial sieht sehr gut aus, danke für den Link. Das werde ich mir definitv anschauen.

    @dot: Ein Screenshot reicht wahrscheinlich nicht aus, ich habe deshalb ein Video gemacht: http://www.youtube.com/watch?v=jgMgfuOB0jc



  • Du hast den Würfel falsch herum gezeichnet.
    Daher siehst du "hinten" was aber durchs Culling entfernt wird.
    http://wiki.delphigl.com/index.php/Backface_Culling

    edit:
    Du kannst auch mittels glFrontFace das ganze umdrehen mit den Params GL_CW (clockwise) und GL_CCW (counter clockwise).
    http://wiki.delphigl.com/index.php/glFrontFace



  • Scorcher24 schrieb:

    Du hast den Würfel falsch herum gezeichnet.
    Daher siehst du "hinten" was aber durchs Culling entfernt wird.
    http://wiki.delphigl.com/index.php/Backface_Culling

    edit:
    Du kannst auch mittels glFrontFace das ganze umdrehen mit den Params GL_CW (clockwise) und GL_CCW (counter clockwise).
    http://wiki.delphigl.com/index.php/glFrontFace

    glFrontFace auf GL_CCW/GL_CW bringt keine Änderung.
    Wie zeichne ich den Würfel richtig rum, bzw. warum ist er falsch rum?



  • Meh, ich hätte schwören können, dass das das Problem darstellt. ^^
    Naja, normal ist clockwise richtig herum. Also im Uhrzeigersinn.
    Counter Clockwise ist dann "hinten". Von welchem Punkt man ausgeht ist egal.



  • Das Problem ist dass deine Vertices mal so und mal so angegeben sind. Die schnelle Lösung ist glDisable(GL_CULL_FACE). Das ist aber keine gute Lösung. Schau dir an was genau Backface Culling ist und pass deine Vertices entsprechend an.



  • dot schrieb:

    Das Problem ist dass deine Vertices mal so und mal so angegeben sind. Die schnelle Lösung ist glDisable(GL_CULL_FACE). Das ist aber keine gute Lösung. Schau dir an was genau Backface Culling ist und pass deine Vertices entsprechend an.

    Ich möchte natürlich die Beste Lösung (-:
    Ich schau mir dann Backface Culling genauer an.

    Nochmal Danke für die Antworten!



  • Ok Backface Culling gelesen und verstanden.
    Aber dort lag nicht der Fehler, ich musste nur GL_DEPTH_TEST aktivieren damit der Würfel korrekt angezeigt wird 🙄



  • Scorcher24 schrieb:

    ...
    Naja, normal ist clockwise richtig herum. Also im Uhrzeigersinn.
    ...

    Bei OpenGL ist CCW die default-Einstellung für das front-face.

    bastianseeleib schrieb:

    Ok Backface Culling gelesen und verstanden.
    Aber dort lag nicht der Fehler, ich musste nur GL_DEPTH_TEST aktivieren damit der Würfel korrekt angezeigt wird 🙄

    Trotzdem gibst du deine Vertices mal CCW und mal CW an.
    Beispielsweise werden bei der "vorderen" Seite die Vertices CCW angegeben, bei der hinteren allerdings dann CW.
    Sobald du face-culling verwendest wirst du sehen, dass das eher suboptimal ist 🙂


Anmelden zum Antworten