Ich verwende 3 Vertex-Puffer gleichzeitig (ich habe tatsächlich viele, aber es werden nur 3 gleichzeitig verwendet).
Sie enthalten Informationen, die in einem Shader zusammengemischt werden, um die gewünschte Ausgabe zu erzeugen - eine 2D-Skelettanimation.
Es gibt zwei bone Puffer, die die Position / Rotation / Skalierung für einen Bone in einem beliebigen Frame enthalten.
Es gibt einen Skin -Puffer, der die Scheitelpunkte zum Rendern einer Region einer Textur enthält, als ob sie sich am Weltursprung befindet, (0,0) .
Im Shader werden die beiden Bone-Buffer mit einem Lockerungswert kombiniert (als Uniform durchlaufen), und dann werden die Teile an den richtigen Stellen gerendert.
Das ist großartig, und es ist eine gute Verbesserung, wo ich angefangen habe - ich habe alles auf der GPU berechnet und nur x / y / u / v-Koordinaten übergeben, ich war limitiert, indem ich so viele Daten an die GPU streamte jedes Bild.
Es gibt jedoch viele duplizierte Informationen. Der Skin-Puffer enthält nur das, was er benötigt, 4 Scheitelpunkte pro Hautteil, die jeweils eindeutig sind.
Wenn es jedoch mit dem Bone kombiniert wird, wird jeder Bone Vertex viermal dupliziert - um den Skin Buffer zu erreichen. Auf dem Handy zu arbeiten, ist ein Schmerz in den Nüssen, weil mir das Gedächtnis knapp wird, und es ärgert mich, dass es so viel Verschwendung gibt.
So würden die Puffer aussehen, wenn nur ein Knochen vorhanden wäre.
Knochenpuffer 1
[x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1]
Knochenpuffer 2
[x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2]
Skin-Puffer
[xA,yA,uA,vA] [xB,yB,uB,vB] [xC,yC,uC,vC] [xD,yD,uD,vD]
Ich werde den kompletten Shader nicht posten, weil dort zu viel Zusatzmaterial läuft (Rotation und Skalierung funktionieren ähnlich):
%Vor%Hinweis; Da ich hauptsächlich auf iOS abziele (andere auch, aber es ist am restriktivsten), weiß ich, dass ich auf 16 Attribute beschränkt bin.
Gibt es eine Möglichkeit, den Speicherbedarf der Knochenpuffer zu verringern? Ich habe viele, viele Bilder zu einem Hautpuffer.
Wie ich sehe, müssen Sie mehr als einen Indexpuffer ( GL_ELEMENT_ARRAY_BUFFER
) für Puffer mit Daten ( GL_ARRAY_BUFFER
) binden. Wenn du 2 GL_ARRAY_BUFFER
Buffer binden kannst, kannst du auch eine separate GL_ELEMENT_ARRAY_BUFFER
binden. Ich weiß nicht, ob das in OpenGL ES implementiert werden kann. Wenn dies nicht möglich ist, können Sie versuchen, Speicher zu sparen, indem Sie Ganzzahlen anstelle von Gleitkommazahlen verwenden. Ich glaube jedoch, dass dies nicht für die Werte für die Translation / Rotation von Knochen gilt.
In Bezug auf Ihre Notiz. Um das Limit von 16 Attributen zu überwinden, können Sie kleinere vec2
-Attribute in vec4
kombinieren. Zum Beispiel können Sie bonePosition1
und bonePosition2
zu einem vec4
kombinieren:
Und dann benutze es so im Shader:
%Vor%Dies kann sich geringfügig auf die Leistung auswirken, aber da dieser Code im Vertex-Shader enthalten ist, sollte der Leistungsabfall vernachlässigbar sein, verglichen mit der Berechnung von Shader. Ich habe ähnlichen Code verwendet, um Farben zu manipulieren (im Fragment-Shader) und die Leistung ist in Ordnung.
Tags und Links opengl-es opengl-es-2.0 vbo