Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 23:44

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 15:28 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hallo leute,
ich habe vor einer Weile die Änderung meiner Modelle von Displaylisten auf VBOs vollzogen. Jetzt bemerke ich, dass es gar nicht korrekt gelaufen ist.

Ich biete im Modell die Möglichkeit, es einerseits smooth (Vertexnormalen) oder eben nicht (Facenormalen) zu rendern. Das Objekt wird dabei geladen und dann werden sowohl Vertex-, als auch Facenormalen berechnet:

Zuerst will ich wissen, welche Vertices an welchem Face anteil haben:
Code:
   public void assignVerticesToFaces()
   {      
      if (loadingStatus != PreparationStatus.Prepared)
      {
         logger.warning("Model is not loaded (loadingStatus='"+loadingStatus.toString()+"'), thus vertices could not be assigned to faces.");
         return;
      }

      List<Short> tmpFaceReference;
      for (int i = 0; i < vertices.length; i++)
      {
         tmpFaceReference = new Vector<Short>();
         for (int j = 0; j < meshes.length; j++)
            for (int k = 0; k < meshes[j].faces.length; k++)
               if ((meshes[j].faces[k].v1 == j) ||
                  (meshes[j].faces[k].v2 == j) ||
                  (meshes[j].faces[k].v3 == j))
                     tmpFaceReference.add((short) k);

         vertices[i].faceReference = new short[tmpFaceReference.size()];

         for (int j = 0; j < vertices[i].faceReference.length; j++)
            vertices[i].faceReference[j] = tmpFaceReference.get(j);
      }
      
      facesAssignedToVertices = true;
   }


Dann berechne ich auf Basis dieser Zuordnung die Facenormalen:
Code:
   public void calculateFaceNormals()
   {
      Mesh currentMesh;
      for (int i = 0; i < meshes.length; i++)
      {
         currentMesh = meshes[i];
         for (int j = 0; j < currentMesh.faces.length; j++)
         {
            currentMesh.faces[j].normal = Vector4f.getNormal(
                  vertices[currentMesh.faces[j].v1].vector,
                  vertices[currentMesh.faces[j].v2].vector,
                  vertices[currentMesh.faces[j].v3].vector);
            
            System.out.println(currentMesh.faces[j].normal.getLength());
         }      
      }
   }


Ich wage zu behaupten, dass das eigentlich so stimmt, denn mit den Displaylisten haben die Facenormalen auch gut ausgesehen.

Am Ende rendere ich das VBO dann:
Code:
       if (lightCombinationMode != LightCombinationMode.Off)
        {   
          if (isSmooth) {
             gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[_INDICES]);
             
               gl.glEnable(GL.GL_LIGHTING);
               gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
            //   System.out.println("vertexnormals");
                  gl.glBindBufferARB(GL.GL_ARRAY_BUFFER_ARB, vbo[_NORMALS_VERTEX]);
               gl.glNormalPointer(GL.GL_FLOAT,0,0);
           }
          else {
             gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
             
             gl.glEnable(GL.GL_LIGHTING);
              gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
           //   System.out.println("facenormal");
                 gl.glBindBufferARB(GL.GL_ARRAY_BUFFER_ARB, vbo[_NORMALS_FACE]);
              gl.glNormalPointer(GL.GL_FLOAT,0,0);
          }
        }

        gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[_INDICES]);


Das Ergebnis sollte ja eigentlich sein, dass Vertexnormalen einen schönen "runden" Eindruck vermitteln und Facenormalen eben alle Kanten deutlich aufzeigen.
Ich habe aber einige komische schwarze Flecken. Aus meiner Erfahrung heraus, dachte ich zuerst, dass es an der Berechnung der Normalen liegt. Aber dann müsste ich diese Flecken eigentlich auch bei den Vertexnormalen sehen. Und an sich sehen die Normalen in der Ausgabe auch gut aus.

Ich poste mal einen Screenshot zum Spekulieren:
Bild

Danke schonmal für Eure Gedanken ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ähm, du zeigst allen möglichen Code aber nicht die Stelle wo die Daten von deinen Arrays in den VBO kommen.

Also für Face-Normalen bekommt jeder Vertex eines Dreiecks die gleiche Normale. Grenzt der Vertex an mehrere Faces mit unterschiedlicher Normale muss der Vertex kopiert werden, hier ist also der eines Index-Buffers also sagen wir mal "eingeschränkt".

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 16:22 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Mh sowas hatte ich schon fast befürchtet, dass die Vertices dann kopiert werden müssen.
Wobei ich mich grad frage, wie das bei den Displaylisten geklappt hatte. Da hab ich beim Erstellen der Displaylisten auch nur nach smooth/!smooth unterschieden und bei !smooth am anfang vor allen 3 Vertices eines faces die Normale gesetzt und bei smooth vor jedem einzelnen vertex des faces die Normalen dediziert gesetzt, aber ohne irgendwas zu kopieren.. Mh

Naja da weiß ich wenigstens schonmal, woran das liegt
Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 16:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
aber ohne irgendwas zu kopieren.. Mh

Die Displayliste macht auch nichts anderes als die Normale zu kopieren...und selbstständig einen Indexbuffer generieren...ich bezweifle es.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 17:17 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Coolcat hat geschrieben:
Die Displayliste macht auch nichts anderes als die Normale zu kopieren..
und selbstständig einen Indexbuffer generieren...ich bezweifle es.


Okay dann wäre zumindest geklärt, wie es mit der Displaylist klappt und mit VBO nicht

Was meinst du jetzt mit dem Indexbuffer?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Was meinst du jetzt mit dem Indexbuffer?

Du scheinst ja einen zu benutzen:
gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[_INDICES]);

Der Displayliste gibst du ja nicht die Information welche Vertices identisch sind. Diese müsste also recht aufwendig die Vertices miteinander vergleichen um einen sinnvollen Indexbuffer zu generieren. Ist zwar machbar, aber ich bezweifle das dies passiert.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 18:08 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Coolcat hat geschrieben:
Zitat:
Was meinst du jetzt mit dem Indexbuffer?

Du scheinst ja einen zu benutzen:
gl.glBindBufferARB(GL.GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[_INDICES]);

Der Displayliste gibst du ja nicht die Information welche Vertices identisch sind. Diese müsste also recht aufwendig die Vertices miteinander vergleichen um einen sinnvollen Indexbuffer zu generieren. Ist zwar machbar, aber ich bezweifle das dies passiert.


Ich glaub ich steh grad etwas auf dem Schlauch.
Ja klar, ich benutze einen IndexBuffer, um aus dem ElementArray die einzelnen Vertices zu indexieren. Das ist ja aber alles VBO Spezifisch, die Displayliste nutzt doch gar keinen Indexbuffer. Oder wo hängts bei mir grad?^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: DisplayListen -> VBO
BeitragVerfasst: Sa Nov 27, 2010 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Das ist ja aber alles VBO Spezifisch, die Displayliste nutzt doch gar keinen Indexbuffer. Oder wo hängts bei mir grad?^^

Die Displayliste macht intern nichts anderes als die Daten die du ihr gibst in einen VBO zu packen. (*) Und das sie dabei wahrscheinlich keinen Indexbuffer benutzt sag ich ja gerade.

(*) Je nach dem was du da machst kann sie auch mehrere VBOs brauchen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]