2013-05-11 16 views
8

Ich habe versucht, meine Textur auf ein Quadrat in opengles 2.0 zu mappen, und wenn ich das tue, erscheint die Textur auf dem Kopf, ist meine Zuordnung falsch? oder wie ich es zeichne? Hier ist ein Bild von dem, was es sieht aus wie:Upside-Down-Textur? | OpenGL-ES 2.0 (android)

Upside Down

hier ist mein Code für die onDrawFrame()

public void onDrawFrame(GL10 glUnused) { 
    GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 
    GLES20.glUseProgram(mProgram); 
    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID); 

    mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); 
    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, 
      false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 

    mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); 
    GLES20.glEnableVertexAttribArray(maPositionHandle); 

    GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, 
      false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 

    GLES20.glEnableVertexAttribArray(maTextureHandle); 


    Matrix.orthoM(mProjMatrix, 0, 0, 200, 0, 100, -5, 5); 
    GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mProjMatrix, 0); 
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, 
      GLES20.GL_UNSIGNED_SHORT, drawListBuffer); 
} 

die Koordination für den Platz und Mapping UV sind:

private final float[] mTriangleVerticesData = { 
     // X, Y, Z, U, V 
     0f, 0f, 0, 0.0f, 0.0f, 
     50f, 0f, 0, 1.0f, 0.0f, 
     50f, 50f, 0, 1.0f, 1.0f, 
     0f, 50f, 0.0f, 0.0f, 1.0f }; 
private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; 

Wie könnte ich eine rechte Ansicht erreichen?

Antwort

6

Das sieht wie ein häufiger Fehler aus. Sie müssen berücksichtigen, dass der Ursprung von OpenGL für Texturen in der unteren linken Ecke (und nicht in der oberen linken Ecke) liegt.

Es gibt ein paar Dinge, die Sie tun können, kompensieren:

  • die Pixel Linien von unten nach oben gelesen;
  • tauschen Sie die Pixelzeilen aus;
  • oder vertauschen Sie die Textur Y-Koordinaten;

Sie könnten versuchen, die Textur Swapping-Koordinaten in einem Shader (Quelle: http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_06)

void main(void) { 
    vec2 flipped_texcoord = vec2(f_texcoord.x, 1.0 - f_texcoord.y); 
    gl_FragColor = texture2D(mytexture, flipped_texcoord); 
} 
+10

Orientierung Swapping ist eine unnötige Berechnung auf der GPU zu tun zu haben. Wenn Sie "upside down" Texturen entdecken und sie * einmal * spiegeln, ist das die beste Option. – GraphicsMuncher

Verwandte Themen