2016-07-06 6 views
0

Ich arbeite an einem Projekt mit OpenGl ES 2.0. Jeder Eckpunkt in meinem Netz hat eine feste Anzahl von Farbattributen (sagen wir 5). Die endgültige Farbe pro Vertex wird als eine Interpolation zwischen zwei ausgewählten Farbattributen berechnet.Wie effektiv interpolieren zwischen vielen Farbattributen in GLSL ES 2.0

In meiner Implementierung basiert die Wahl der zwei Farben auf zwei gegebenen Indizes. Ich bin mir bewusst, dass if Anweisung durch eine große Leistung getroffen werden kann, so eine Option, alle Attribute in ein Array zu setzen und Indexierung verwenden, um gewünschte Farben abrufen. Trotzdem sehe ich einen deutlichen Leistungsabfall.

attribute vec4 a_position; 
//The GLSL ES 2.0 specification states that attributes cannot be declared as arrays. 
attribute vec4 a_color; 
attribute vec4 a_color1; 
attribute vec4 a_color2; 
attribute vec4 a_color3; 
attribute vec4 a_color4; 

uniform mat4 u_projTrans; 
uniform int u_index; 
uniform int u_index1; 
uniform float u_interp; 

varying vec4 v_color; 


void main() 
{ 
    vec4 colors[5]; 
    colors[0] = a_color; 
    colors[1] = a_color1; 
    colors[2] = a_color2; 
    colors[3] = a_color3; 
    colors[4] = a_color4; 

    v_color = mix(colors[u_index], colors[u_index1], u_interp); 

    gl_Position = u_projTrans * a_position; 
} 

Gibt es eine bessere und effizientere Methode zur Berechnung der endgültigen Farbinterpolation? Oder zumindest eine bessere Möglichkeit, Interpolationsfarben zu wählen?

Antwort

0

Die Indizes, die Sie hier verwenden, sind Uniformen. Das bedeutet, dass jeder Scheitelpunkt in jedem Renderbefehl dieselben Indizes verwendet. Wenn das der Fall ist ... warum schaffst du es, dieses Zeug im VS überhaupt zu holen?

Sie sollten nur 2 Farbeingabewerte haben. Sie verwenden dann glVertexAttribPointer, um die zwei Arrays auszuwählen, zwischen denen interpoliert wird.

Ihr "signifikanter Leistungsabfall" hat wahrscheinlich nichts damit zu tun, wie Sie solche Werte abrufen, und alles damit zu tun, dass Sie eine Menge per-Vertex-Daten senden, die niemals für irgendetwas verwendet werden.

+0

Sie haben Recht, dass ich nicht alle Attribute gleichzeitig verwende. Das Mesh wird jedoch derzeit als Vertex-Puffer-Objekte ausgeführt. Gibt es bei der Verwendung von Vertex-Arrays keinen erheblichen Mehraufwand? Mein Anwendungsfall ist eher statisch. Erzeuge Netze, animiere sie mit Uniformen, zerstöre sie, wenn sie nicht benötigt werden. – plastique

+1

@plastique: "* Aber das Mesh wird derzeit als Vertex-Puffer-Objekte durchgeführt. Gibt es keinen erheblichen Overhead bei der Verwendung von Vertex-Arrays? *" ... Sie * verwenden * Vertex-Arrays. Was denkst du, was du in deinen Pufferobjekten speicherst? Nirgendwo schlug ich vor, dass Sie * clientseitige * Vertex-Arrays verwenden sollten. –