2016-10-12 5 views
0

Ich habe einen gepackten Vertex-Puffer, der Positionskoordinaten sowie Farbwerte für einen Stützpunkt im Format {x, y, z, r, g, b} enthält.Android glVertexAttribPointer Schritt/Versatz

Ich bin in der Lage, die richtigen XYZ-Werte an den Vertex-Shader zu übergeben. Unerwartet erscheint das gerenderte Quadrat weiß.

Wie kann glVertexAttribPointer (...) zum Rendern aus einem gepackten Vertex-Puffer verwendet werden?

Code:

public float vertices[] = { 
     1, 1, 1, 255, 255, 255, 
     -1, 1, 1, 255, 87, 255, 
     -1, -1, 1, 87, 67, 255, 
     1, -1, 1, 0, 0, 0 
}; 
public FloatBuffer verticesBuffer; 

public int indices[] = { 
     0, 1, 3, 
     1, 2, 3 
}; 
public IntBuffer indicesBuffer; 

ByteBuffer bb = ByteBuffer.allocateDirect(vertices.length * 4); 
bb.order(ByteOrder.nativeOrder()); 
verticesBuffer = bb.asFloatBuffer(); 
verticesBuffer.put(vertices); 
verticesBuffer.position(0); 

bb = ByteBuffer.allocateDirect(indices.length * 4); 
bb.order(ByteOrder.nativeOrder()); 
indicesBuffer = bb.asIntBuffer(); 
indicesBuffer.put(indices); 
indicesBuffer.position(0); 

@Override 
public void onDrawFrame(GL10 notUsed) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glUseProgram(programId); 

    verticesBuffer.position(0); 
    glEnableVertexAttribArray(vertexPositionHandle); 
    glVertexAttribPointer(vertexPositionHandle, 3, GL_FLOAT, false, (POS_SZ + COL_SZ) * FLOAT_SZ, verticesBuffer); 

    verticesBuffer.position(POS_SZ); 
    glEnableVertexAttribArray(vertexColorHandle); 
    glVertexAttribPointer(vertexColorHandle, 3, GL_FLOAT, false, (POS_SZ + COL_SZ) * FLOAT_SZ, verticesBuffer); 

    glUniformMatrix4fv(projectionMatrixHandle, 1, false, projectionMatrix, 0); 
    glUniformMatrix4fv(viewMatrixHandle, 1, false, viewMatrix, 0); 
    glUniformMatrix4fv(modelMatrixHandle, 1, false, modelMatrix, 0); 

    glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_INT, indicesBuffer); 

    glDisableVertexAttribArray(vertexPositionHandle); 
    glDisableVertexAttribArray(vertexColorHandle); 
} 

Shaders:

public static String VertexShader = 
    "attribute vec3 a_Position;" + 
    "attribute vec3 a_Color;" + 
    "" + 
    "uniform mat4 u_ProjectionMatrix;" + 
    "uniform mat4 u_ViewMatrix;" + 
    "uniform mat4 u_ModelMatrix;" + 
    "" + 
    "varying vec3 v_Color;" + 
    "" + 
    "void main()" + 
    "{" + 
     "gl_Position = u_ProjectionMatrix * u_ViewMatrix * u_ModelMatrix * vec4(a_Position, 1);" + 
     "v_Color = a_Color;" + 
    "}"; 
public static String FragmentShader = 
    "precision mediump float;" + 
    "" + 
    "varying vec3 v_Color;" + 
    "" + 
    "void main()" + 
    "{" + 
     "gl_FragColor = vec4(1, v_Color);" + 
    "}"; 
+1

Dies ist zuvor gekommen, aber ich bin mir nicht sicher, wie man eines der Duplikate am besten findet. Da Sie die Farben als Float-Werte angeben, müssen sie normalisiert werden, dh sie liegen im Bereich von 0,0 bis 1,0. –

Antwort

0

Dank Reto Koradi, hatte ich zwei Fragen ...

Die Vertex Farbe in so geführt wird Werte von 0-1. Die Eckpunkte Array sein musste:

public float vertices[] = { 
     1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 
     -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 
     -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 
     1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 
}; 

Auch hatte ich ein kleines Problem im Fragment Shader:

"gl_FragColor = vec4(1, v_Color);" + 

Es (r, g, b, a), so sein, es soll:

"gl_FragColor = vec4(v_Color, 1);" + 
Verwandte Themen