[OpenGL] Materialprobleme



  • Ich arbeite an einem ".3ds-Loader" und denke nun, alle (für mich relevanten) Daten korrekt ausgelsesn zu haben. Das soll heißen, dass alle Flächen angezeigt werden und auch die Materialien (Ambient, Diffuse ...) da sind. Ich habe die äußeren Flächennormalen berechnet und lasse mir das Ergebnis anzeigen:
    http://vireso.vi.funpic.de/sonstiges/material.jpg

    Das Testobjekt ist ein einfacher Würfel der seltsamerweise komplett weiß ist. Das kleine Dreieck habe ich manuell eingefügt (um zu sehen, dass der Fehler nicht am Material liegt). Die kleinen Linien sind die Normalenvektoren, die dem Anschein nach also auch richtig sind.

    So bewandert bin ich in OpenGL noch nicht, also wer kann mir mögliche Fehlerquellen nennen? Hier der Code zum Zeichen:

    void Model::DrawFaces()
    {
        std::vector<Material>::iterator tMatIt;
        for(int i=0; i<mQtyFaces; i++) {
            tMatIt = mMaterials.begin() + mFaces[i][3];
            tMatIt->SelectMaterial();
            glBegin(GL_TRIANGLES);
                glNormal3fv(mNormals[i]);
                glTexCoord2f(mMapping[mFaces[i][0]][0], mMapping[mFaces[i][0]][1]);
                glVertex3fv(mVertices[mFaces[i][0]]);
                glTexCoord2f(mMapping[mFaces[i][1]][0], mMapping[mFaces[i][1]][1]);
                glVertex3fv(mVertices[mFaces[i][1]]);
                glTexCoord2f(mMapping[mFaces[i][2]][0], mMapping[mFaces[i][2]][1]);
                glVertex3fv(mVertices[mFaces[i][2]]);
            glEnd();
            glBegin(GL_LINES);    // Normalenvektor zeichnen
                glVertex3fv(mVertices[mFaces[i][0]]);
                glVertex3f(mVertices[mFaces[i][0]][0]+mNormals[i][0],
                    mVertices[mFaces[i][0]][1]+mNormals[i][1],
                    mVertices[mFaces[i][0]][2]+mNormals[i][2]);
            glEnd();
        }
    
        glBegin(GL_TRIANGLES);    // Testdreieck zeichnen
            glNormal3f(0.0, 0.0, -1.0);
            //glTexCoord2f(, );
            glVertex3f(1.0, 1.0, 6.0);
            //glTexCoord2f(, );
            glVertex3f(0.0, 1.0, 6.0);
            //glTexCoord2f(, );
            glVertex3f(0.0, 0.0, 6.0);
        glEnd();
        glBegin(GL_LINES);
            glVertex3f(1.0, 1.0, -1.0);
            glVertex3f(1.0, 1.0, -1.0-1.0);
        glEnd();
    }
    

    // EDIT: Kleine Ergänzung -> Lasse ich die Angabe der Normalenvektoren in Zeile 8 weg, so erscheint der Würfel im gegebenen Material, aber ohne Schattierung (alle Flächen gleiche Farbe, unabhängig von ihrer Orientierung im Raum).



  • Hat denn niemand irgendeine Idee, möglich Ursachen, irgendetwas?

    Hier noch die Funktion zum Materialauswählen:

    void Material::SelectMaterial()
    {
        glBindTexture(GL_TEXTURE_2D, mTexture);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mAmbient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mDiffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mSpecular);
        glMaterialfv(GL_FRONT, GL_SHININESS, &mShininess);
    }
    

    (Die Vektoren (Arrays) sind korrekt mit Werten belegt.)

    Die Berechnung der Normalen erfolgt wie in diesem Artikel beschrieben:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-177430.html



  • Hm, also das der Würfel weiss bleibt könnte erstmal darauf hindeuten das die Textur gar nicht angebunden ist. Prüfe mal ob da beim Laden was schiefgeht o.ä. An sonsten muss für Material-Eigenschaften das Beleuchtungsmodell aktiviert und eine einfache Lichtquelle vorhanden sein.

    glEnable(GL_LIGHTING);
    	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
    	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
    	glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular);
    	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
    	glEnable(GL_LIGHT1);
    


  • Naja, in diesem konkreten Testfall ist die Textur = 0. Ich glaube, an der Beleuchtung kann es nicht liegen, denn wie oben beschrieben wird eine manuell eingefügte Testfläche auch mit dem Material angezeigt.



  • Schreib anstatt SelectMaterial mal testweise den Block aus dieser Funktion mit Testwerten direkt in den Source.

    Also irgendwie sowas:

    float TestAmbient[4];
    TestAmbient[0] = 0.7f;
    TestAmbient[1] = 0.7f;
    TestAmbient[2] = 0.7f;
    TestAmbient[3] = 1.0f;
    glBindTexture(GL_TEXTURE_2D, mTexture);
    glMaterialfv(GL_FRONT, GL_AMBIENT, TestAmbient);
    ...
    

    Nur um zu sehen, das es wirklich nicht an den Materialeigenschaften liegt, bzw an der Materialauswahl.
    (Edit)
    Ach ja, und ersetze GL_FRONT im ersten Parameter von glMaterial mal durch GL_FRONT_AND_BACK. Vielleicht ist deine Vertex-Reihenfolge auch falschrum.



  • GL_FRONT_AND_BACK brauche ich nicht, ich habe Culling aktiviert. Danke für deine Mühe, sie hat mich auf den richtigen Pfad gebracht. Beim Auslesen wurde der Shininess-Wert nicht richtig gesetzt und meine Lichtquelle war ungünstig positioniert. Beides zusammen ergab einen weißen Würfel. 🙄


Log in to reply