[OpenGL]evtl Problem beim sortieren der Normalen?


  • Mod

    Cyphron schrieb:

    @rapso

    also ich dachte eigentlich das wäre so korrekt.
    Denn der Vertex 1 gehört ja zu beiden Flächen bzw insg. 5 Flächen.

    Die beiden Flächen "blicken" auch in die jeweilige Richtung.

    Tut mir leid das ich grade nicht verstehe was du meinst 😞

    vielleicht versteh ich ja etwas an deinem code nicht, kannst du mir nochmal sagen, wie du die zwei faces die
    1. eine position haben

    v 1.000000 -1.000000 -1.000000
    

    2. die in zwei verschiedene richtungen zeigen

    vn 0.000000 -1.000000 0.000000
    vn 1.000000 0.000000 0.000000
    

    mit nur einem vertex representieren kannst, ohne dass es falsch ausschaut?



  • Na es ist doch so das ein Würfel 8 Ecken Hat. Deswegen 8mal v.
    Über glVertexPointer(3, GL_FLOAT, 0, &vertices[0]); gebe ich OpenGL diese Ecken
    (8x3 für x,y,z).

    Dann muss man noch festlegen wie der Körper Zusammengesetzt wird.
    dies sage ich über:

    f 1//1 2//1 3//1
    

    Jedes f ist hierbei eine Fläche. Statt jedes mal die x,y,z Werte hinzuschreiben wird nur der Index aus der v liste hingeschrieben. Also Fläche 1,2,3 nutzt (die erste)

    v 1.000000 -1.000000 -1.000000
    v 1.000000 -1.000000 1.000000
    v -1.000000 -1.000000 1.000000
    

    Dadurch wird viel Redundanz eingespart und da ich die Daten der Ecken in den Grafikkartenspeicher lege spare ich somit wertvollen Speicher auf der Grafikkarte.

    Die Indices ist die Liste die OpenGl sagt wie es zusammengebaut wird.
    (Indices nach einlesen: (1,2,3,1,5,6....). Übergeben tu ich dieses Indices über:

    glDrawElements(GL_TRIANGLES, indices.size(),GL_UNSIGNED_INT,&indices[0]);
    

    Da ich als "Modus" GL_TRIANGLES angegeben habe, nutzt OpenGL jeweils 3 Indices (die auf eine Ecke des Würfels verweisen) um Damit 1 Dreieck zu Zeichnen. Dies ergibt bei 6 Flächen des Würfels 12 Polygone da der Würfel Trianguliert wurde.

    Durch die Triangulierung ist es theoretisch möglich das 6 Flächen (aber Mind 2) einen Eckpunkt nutzen. Bei diesen sind es 5.

    Bei den Normalen ist es so wie bei den Ecken das sie über Ihren Index referenziert werden. Zwar hat jede Fläche in diesem Fall nur eine Normale (deswegen 3 mal 1 bei f 1//1 2//1 3//1), das muss aber nicht immer so sein. Z.B bei Kugeln (oder anderen Rundungen):

    Flat Shading(1 Normale je Fläche)vs Smooth Shading(1 Normale je Eckpunkt):
    http://imageshack.us/photo/my-images/233/31872976.png/

    mein Problem ist aber nun die Normalen in OpenGL geeignet zu übermitteln (deswegen die Umsortierung). Bei den Eckpunkten ist es kein Problem weil man deren indices übergeben kann. Die Normalenindices leider aber nicht 😞

    Das Problem liegt also hier:

    //erstelle die sortieren Normalenliste:
        for(int i=0; i<indices.size();i++)
        {
    
            vectorNormals[indices[i]*3]=normals[normalsIndices[i]*3];
            vectorNormals[indices[i]*3+1]=normals[normalsIndices[i]*3+1];
            vectorNormals[indices[i]*3+2]=normals[normalsIndices[i]*3+2];
        }
    

  • Mod

    ich wiederhole es gerne noch ein drittes mal:

    wie soll dein sortiercode funktionieren bei dem fall, dass du zwei faces hast, die dieselbe position beim ersten vertex haben, aber ZWEI UNTERSCHIEDLICHE normalen?



  • rapso schrieb:

    ich wiederhole es gerne noch ein drittes mal:

    wie soll dein sortiercode funktionieren bei dem fall, dass du zwei faces hast, die dieselbe position beim ersten vertex haben, aber ZWEI UNTERSCHIEDLICHE normalen?

    Ich kann dein Problem an diesen Punkt überhaupt nicht verstehen. 2 Faces mit 2 Blickrichtungen. Jeder Punkt hat eine Normale für JEDES Face. Aus dem Punkt muss ich dir wiedersprechen das dort ein Wiederspruch beseht.

    hier meine Sortierte normalenliste für die Beiden Faces:

    Face:1
    0:-1:0
    0:-1:0
    0:-1:0
    Face:2
    1:0:0
    1:0:0
    1:0:0
    

    <<genauso hatte ich es auch erwartet...

    Das ganze klappt bei Komplexen Körpern wunderbar. Vll ist es auch gar kein Fehler sondern das Ergebniss entsprach nur nicht meinen erwarungen was das "Beleuchtungslevel" der einzelnen Flächen angeht.

    hier nochmal ne Genmanipulierte Banane:
    http://imageshack.us/photo/my-images/213/dingw.png/

    Ist das was ich erwartet habe.

    Edit sez:
    Ich mach jetzt einfach mit Texturierung und Material weiter.


  • Mod

    Cyphron schrieb:

    rapso schrieb:

    ich wiederhole es gerne noch ein drittes mal:

    wie soll dein sortiercode funktionieren bei dem fall, dass du zwei faces hast, die dieselbe position beim ersten vertex haben, aber ZWEI UNTERSCHIEDLICHE normalen?

    Ich kann dein Problem an diesen Punkt überhaupt nicht verstehen. 2 Faces mit 2 Blickrichtungen. Jeder Punkt hat eine Normale für JEDES Face. Aus dem Punkt muss ich dir wiedersprechen das dort ein Wiederspruch beseht.

    du uebergibst deine positionen, normalen, texturcoordinaten aber nicht nicht pro face sondern pro vertex. dafuer hast du ja deine wundersame "transformation" entwickelt.

    initialisiere dein vectorNormals mit (0|0|0) normalen, und steppe ein paar mal durch den loop, du wirst erkennen, dass du auf eine schon zugewiesene stelle nochmals eine _andere_ normale zuweist.

    du wirst dasselbe problem mit texturcoordinates haben, wenn du dort auch soeine wundersame "transformation" machst.



  • ok da hast du recht. Ich hatte dich völlig anders verstanden. Ich dachte du meintest die Datenstruktur...

    ich habe jetzt meinen schleifenrumpf abgewandelt:

    vectorNormals[i*3]=normals[normalsIndices[i]*3];
    	vectorNormals[i*3+1]=normals[normalsIndices[i]*3+1];
    	vectorNormals[i*3+2]=normals[normalsIndices[i]*3+2];
    

    Ergebniss nachher:

    Index:1- Normale:1=0:-1:0
    Index:2- Normale:1=0:-1:0
    Index:3- Normale:1=0:-1:0
    Index:1- Normale:1=0:-1:0
    Index:3- Normale:1=0:-1:0
    Index:4- Normale:1=0:-1:0
    Index:5- Normale:2=0:1:0
    Index:8- Normale:2=0:1:0
    Index:7- Normale:2=0:1:0
    Index:5- Normale:2=0:1:0
    Index:7- Normale:2=0:1:0
    Index:6- Normale:2=0:1:0
    Index:1- Normale:3=1:0:0
    Index:5- Normale:3=1:0:0
    Index:6- Normale:3=1:0:0
    Index:1- Normale:3=1:0:0
    Index:6- Normale:3=1:0:0
    Index:2- Normale:3=1:0:0
    Index:2- Normale:4=-0:-0:1
    Index:6- Normale:4=-0:-0:1
    Index:7- Normale:4=-0:-0:1
    Index:2- Normale:4=-0:-0:1
    Index:7- Normale:4=-0:-0:1
    Index:3- Normale:4=-0:-0:1
    Index:3- Normale:5=-1:-0:-0
    Index:7- Normale:5=-1:-0:-0
    Index:8- Normale:5=-1:-0:-0
    Index:3- Normale:5=-1:-0:-0
    Index:8- Normale:5=-1:-0:-0
    Index:4- Normale:5=-1:-0:-0
    Index:5- Normale:6=0:0:-1
    Index:1- Normale:6=0:0:-1
    Index:4- Normale:6=0:0:-1
    Index:5- Normale:6=0:0:-1
    Index:4- Normale:6=0:0:-1
    Index:8- Normale:6=0:0:-1
    

    Damit sehen zwar die Werte Richtig aus aber beim Rendern der Kugeln sieht das dann z.b. so aus (natürlich mit anderen daten als die für den Würfel):
    http://imageshack.us/photo/my-images/687/kugeln.png/

    😞

    Kann es sein das ich das selbe wie mit den Normalen auch mit den Vertices machen muss?


  • Mod

    du musst neue vertices erstellen, ja! (aus position|normal|texcoord)



  • rapso schrieb:

    du musst neue vertices erstellen, ja! (aus position|normal|texcoord)

    verdammt 😞

    Danke für die Hilfe 👍


  • Mod

    ach ja, schau dir bei glVertexPointer(3, GL_FLOAT, 0, &vertices[0]) den 3ten parameter an, er ist speziell dafuer gedacht solche vertices zu haben/unterstuetzen.



  • rapso schrieb:

    ach ja, schau dir bei glVertexPointer(3, GL_FLOAT, 0, &vertices[0]) den 3ten parameter an, er ist speziell dafuer gedacht solche vertices zu haben/unterstuetzen.

    Ich hatte das als eine art "Offset" zwischen vertices verstanden. so das z.b. daten dazwischen stehen könnten. Z.B. Für solch einen Fall:

    struct vertex
    {
        float xyz[3];
        float uvw[3];
        float n[3];
    };
    

    Wobei der 3. Parameter dann sizof(vertex) ist. bringt dies Performancetechnische vor- bzw nachteile? Oder ist es nur als Hilfe für solche structs gedacht?


Anmelden zum Antworten