Chromanoid hat geschrieben:dann sortierst du die vertices einfach nach x,y,z. dann gehst du diese sortierte liste durch und ersetzt alle doppelten vertices im indexbuffer
Das muss ich mal probieren. Im Moment hab ich leider eine Wegwerfstrategie, sobald daten in der GraKa sind schmeiss ich sie weg. Sonst würde ich den hohen Durchsatz nicht lange hinbekommen. Das Problem ist dass ich nicht weiss ob evtl. später weitere Geometrie hinzukommt.. dann hab ich plötzlich doppelte Verticies, aber gar keine Zugriff mehr auf die alten, solange ich nicht aus der GraKa zurücklese.
Chromanoid hat geschrieben:ich kenn mich da nicht aus aber so aus dem bauch heraus könnte ich mir vorstellen, dass du beim zusammenfassen der gleichen vertices zu einem neuen noch alle normalen der vertices nehmen kannst und den durchschnitt davon als neue normale für den neuen vertex nimmst...
Warum durchgestrichen? Das ist eine tolle Idee. Das werd ich probieren, wenn ich die Wegschmeissstrategie im Griff hab.
Die optimale Lösung wäre, von allen an die GraKa geschickten Daten genau die Randverticies im Speicher behalten zu können. Dann kann man später weitere Geometrie anpassen. Man müsste aber auch die Normalen der schon in der GraKa befindlichen Randverticies neu berechnen. Vielleicht verwendet man immer zwei Buffer, einen mit x,y,z und allen Textur-Daten, und einen weiteren nur mit den Normalen.
Perfekt wäre, wenn ich eine bestimmte Menge Geometrie zur GraKa schicken kann, und später, wenn ich weitere Stücke nachschicke, auf der GraKa die Normalen verbunden werden können. Dazu fällt mir aber grad kein Shader ein. Vielleicht geht sowas mit CUDA/OpenCL?
Auch witzig aber wild wäre, die Normalen im Screenspace zu berechnen. Vielleicht so:
Die Verticies bekommen Texturkorrdinaten pro Primitive, also über jedem Dreieck ein ganzer Texturdurchlauf. Der Pixelshader schreibt Dreiecksnormalen (Flat-Shading) und diese komischen Texturkoordinaten in den Framebuffer.
Ein zweiter Pass im Screenspace liest jetzt die Texturkoordinaten, und kann damit den Abstand zu den Dreieckskanten bestimmen. So kann der Pixelshader ein paar Pixel an den Kanten der Nachbardreiecke auslesen und kennt damit die Normalen an allen Kanten des Dreieicks. Daraus kann er die Normale im aktuellen Pixel interpolieren. Dann kann das Shading berechnet werden..