2016-06-12 8 views
0

Ich möchte einen Audio-Visualizer mit Android GLES20 machen. captured image that I want to makeandroid opengl GLES20: Wie zeichnet man viele Dreiecke mit jeder Modellmatrix? (mit guter Leistung))

die Position jedes Rechtecks ​​ist (0, 0), (0, 1), (1, 1), (1, 0)

jedes Rechteck verschiedenen Modellmatrix aufweist. (Drehen, Verschieben, Skalieren)

Und jedes Rechteck zeichnen mit GLES20.glDrawArrays. Aber dieser Weg kostet zu viel Zeit. (Mit, dass das Verfahren 200 mal) (Natürlich, ich 60 FPS wollen.)

Wenn ich GLES20.glDrawArrays Methode gleichzeitig verwenden und ziehen alle Rechtecke (= Dreiecke) auf einmal, Leistung wird gut werden.

Wie kann ich mit der Methode GLES20.glDrawArrays Dreiecke gleichzeitig zeichnen? (Dreieck hat gleiche Position Puffer, verschiedene Modellmatrix)

private void draw(int[] bufferId, int color, float[] modelMatrix, int count) { 
    GLES20.glUseProgram(programHandle); 
    int uMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix"); 
    int aPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position"); 
    int aColorHandle = GLES20.glGetAttribLocation(programHandle, "a_Color"); 


    Matrix.multiplyMM(MVMatrix, 0, viewMatrix, 0, modelMatrix, 0); 
    Matrix.multiplyMM(MVPMatrix, 0, projectionMatrix, 0, MVMatrix, 0); 
    GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); 
    GLES20.glVertexAttrib4f(aColorHandle, Color.red(color)/255f, Color.green(color)/255f, Color.blue(color)/255f, Color.alpha(color)/255f); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferId[0]); 
    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, 0); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
    GLES20.glEnableVertexAttribArray(aPositionHandle); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, count); 
} 

diese Methode ein Rechteck mit Puffer, Farbe, Modellmatrix ziehen. (count = 4)

+0

Zuerst würde ich die glUseProgram Zeile am Anfang dieser Zeichenmethode loswerden. Es ist unnötig, wenn jedes Rechteck das gleiche Programm verwendet (das sieht so aus) und ich bin kein Experte, aber das verlangsamt möglicherweise Ihren FPS (wenn auch nicht viel). Fügen Sie stattdessen in Ihrer onDrawFrame() -Methode die glUseProgram-Zeile ein, bevor Sie auf jedes Rechteck zeichnen. – brohan322

+0

Zusätzlich sind diese Handles int uMVPMatrixHandle = GLES20.glGetUniformLocation (programHandle, "u_MVPMatrix"); int aPositionHandle = GLES20.glGetAttribLocation (programHandle, "a_Position"); int aColorHandle = GLES20.glGetAttribLocation (programHandle, "a_Color"); sind für jedes Rechteck gleich. Dies wird FPS vermutlich nicht so sehr verbessern, aber ich würde keine Zeit damit verschwenden, diese Griffe für JEDES Rechteck zu definieren. Platzieren Sie diese Zeilen stattdessen in der onSurfaceCreated() -Methode, und gewähren Sie ihnen Zugriff in der draw() -Methode der Rechtecke. – brohan322

+0

Dies waren nur Vorschläge zur leichten Verbesserung der FPS, sie werden keine wesentliche Verbesserung der FPS zeigen, aber es könnte ein wenig helfen. Ich habe keine Ahnung, was dein aktueller FPS ist – brohan322

Antwort

0

Verteilen Sie die Scheitelpunkte in einem einzigen Zeichenaufruf, laden Sie eine Matrix mit uniformen Matrizen hoch und fügen Sie jedem Rechteck ein Scheitelpunktattribut hinzu, um anzugeben, welcher Array-Index verwendet werden soll.

Das gesagt - es gibt wahrscheinlich Grenzen, wie viel einheitlicher Raum Sie verwenden können, so dass 200 Matrizen ist unwahrscheinlich, dass zu arbeiten. Wenn Sie nur Rechtecke bearbeiten, die eine kleine Anzahl von Scheitelpunkten haben, ist es wahrscheinlich schneller, sie nur auf der CPU zu animieren und die vortransformierten Clip-Space-Koordinaten auf die GPU hochzuladen.

Verwandte Themen