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()];
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.
Ä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".
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
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.
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?^^
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.
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.