2012-10-03 12 views
6

ben OpenGL kullanarak metin gösterecektir bir uygulama yapmaya çalışıyorum ile istediğiniz sonuçları elde değil. Belirli bir pozisyona belirtilen nesneyi taşımak için Matrix.translateM kullanmaya çalıştığımda beklenmeyen davranışlar olsun. Diğer tüm dönüşüm matrisleri, beklediğim gibi çalışır. result imageAndroid OpenGL ES 2.0: Ben Matrix.traslateM

Bu görüntü çeviri olmadan:

Bu benim Matrix.translateM(model_matrix, 0, -1.0f, 0, 0) çağırdığınızda ne alıyorum enter image description here

Bu benim Oluşturucu kodudur.

@Override 
public void onSurfaceCreated(GL10 unused, EGLConfig config) { 
    GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 
    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

    // create programs 
    simple_texture = new SimpleTexture(); 

    // create shapes 
    square = new Square(); 

    // create debug text handlers 
    text_fps = new Text(this.font, this.text_scale); 
    text_fps.setSize(50); 
    text_fps.setText("Test\nLonger line"); 

    // set camera position 
    final float eyeX = 0.0f; 
    final float eyeY = 0.0f; 
    final float eyeZ = -3.0f; 

    final float lookX = 0.0f; 
    final float lookY = 0.0f; 
    final float lookZ = 0.0f; 

    final float upX = 0.0f; 
    final float upY = 1.0f; 
    final float upZ = 0.0f; 

    Matrix.setLookAtM(view_matrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); 
} 

@Override 
public void onSurfaceChanged(GL10 unused, int width, int height) { 
    GLES20.glViewport(0, 0, width, height); 

    // set projection matrix 
    float ratio = (float) width/height; 
    Matrix.orthoM(projection_matrix, 0, -ratio, ratio, -1, 1, 3, 7); 

    setScreenRatio(ratio); 
    setScreenHeight(height); 
} 

@Override 
public void onDrawFrame(GL10 unused) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

    // calculate projection and view transformation 
    Matrix.multiplyMM(vp_matrix, 0, projection_matrix, 0, view_matrix, 0); 

    // if we are connected to debugger draw statistics 
    drawStatistics(vp_matrix); 
} 

Ve bu metin için benim draw kodudur.

// use predefined program 
    GLES20.glUseProgram(program); 

    // get attribute positions 
    attr_matrix = GLES20.glGetUniformLocation(program, "u_Matrix"); 
    attr_position = GLES20.glGetAttribLocation(program, "a_Position"); 
    attr_texture_position = GLES20.glGetAttribLocation(program, "a_TexturePosition"); 
    attr_texture = GLES20.glGetUniformLocation(program, "u_Texture"); 

    // set program parameters 
    GLES20.glEnableVertexAttribArray(attr_position); 
    GLES20.glVertexAttribPointer(attr_position, 2, GLES20.GL_FLOAT, false, 2 * 4, square_buffer); 

    // set texture parameters 
    GLES20.glEnableVertexAttribArray(attr_texture_position); 
    GLES20.glVertexAttribPointer(attr_texture_position, 2, GLES20.GL_FLOAT, false, 2 * 4, texture_buffer); 

    // set matrix 
    float[] result = new float[16]; 
    float ratio = (float) texture_height/texture_width; 
    float screen_scale = (float) texture_height/PageRenderer.getScreenHeight(); 

    Matrix.setIdentityM(model_matrix, 0); 
    Matrix.translateM(model_matrix, 0, -1, 0, 0); 
    Matrix.scaleM(model_matrix, 0, screen_scale, screen_scale * ratio, screen_scale); 

    Matrix.setIdentityM(result, 0); 
    Matrix.multiplyMM(result, 0, matrix, 0, model_matrix, 0); 
    GLES20.glUniformMatrix4fv(attr_matrix, 1, false, result, 0); 

    // assign texture 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, index); 
    GLES20.glUniform1i(attr_texture, 0); 

    // perform drawing 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 

    // disable vertex array 
    GLES20.glDisableVertexAttribArray(attr_position); 
    GLES20.glDisableVertexAttribArray(attr_texture_position); 

Shader:

int vertex_shader = PageRenderer.loadShader(
      GLES20.GL_VERTEX_SHADER, 
      "uniform mat4 u_Matrix;" + 
      "attribute vec4 a_Position;" + 
      "attribute vec2 a_TexturePosition;" + 
      "varying vec2 v_TexturePosition;" + 
      "void main() {" + 
      " gl_Position = a_Position * u_Matrix;" + 
      " v_TexturePosition = a_TexturePosition;" + 
      "}" 
     ); 
    int fragment_shader = PageRenderer.loadShader(
      GLES20.GL_FRAGMENT_SHADER, 
      "precision mediump float;" + 
      "varying vec2 v_TexturePosition;" + 
      "uniform sampler2D u_Texture;" + 
      "void main() {" + 
      " gl_FragColor = texture2D(u_Texture, v_TexturePosition);" + 
      "}" 
     ); 

Ölçekleme ve ancak tercüme nedenini anlamaya olamaz beklendiği gibi dönen iş yapmaz. Ben yakın zamana kadar OpenGL kullanın vermedi unutmayın.

Ben 'döndürme' değil, sola metni taşımak için translateM için bekliyordum.

+0

benziyor ne gerekiyordu? Ne bekliyordun? Ayrıca, gölgelendiricilerinizi gösterebilir misiniz. – Tim

+0

@T emin bir şey. Ayrıntılar eksikliği için üzgünüm. Shader kodu ve görüntüyü translateM' olmadan göründüğü şekilde ekledim. “TranslateM” görüntüyü sola hareket ettirmeyi bekliyordum. – MeanEYE

+0

Ah, pardon. Şimdi, gölgelendirici koduna ikinci bir bakış yaptığım sorunu buldum. :) Teşekkürler. – MeanEYE

cevap

11
değişkenlerin

al gl_Position hesaplama önemlidir! Dünya matrisi önce ve sonra köşe koordinatları gider. Soru sorduğumda bunu biliyordum, ancak Android OpenGL öğreticisinden shader kodu alındığından bu konuya dikkat etmedik. Milletler olsun. Öğretici doğru değil!

Doğru shader kodu:

int vertex_shader = PageRenderer.loadShader(
      GLES20.GL_VERTEX_SHADER, 
      "uniform mat4 u_Matrix;" + 
      "attribute vec4 a_Position;" + 
      "attribute vec2 a_TexturePosition;" + 
      "varying vec2 v_TexturePosition;" + 
      "void main() {" + 
      " gl_Position = u_Matrix * a_Position;" + 
      " v_TexturePosition = a_TexturePosition;" + 
      "}" 
     ); 
    int fragment_shader = PageRenderer.loadShader(
      GLES20.GL_FRAGMENT_SHADER, 
      "precision mediump float;" + 
      "varying vec2 v_TexturePosition;" + 
      "uniform sampler2D u_Texture;" + 
      "void main() {" + 
      " gl_FragColor = texture2D(u_Texture, v_TexturePosition);" + 
      "}" 
     ); 
+0

En korkunç şey, basit şekiller çizerseniz ve karmaşık şekiller çizdiğinizde felaket olursa bu hatanın görünmez olmasıdır. MeanEYE için teşekkürler! –

+0

Ben aynı sorunu yaşıyorum ama çözüm sadece benim için shaderı çöker. Ben sadece 'gl_position = a_Position * u_Matrix' yaptığımda işlenebilecek şeyler elde edebilirim. Hatta çoğalma sırasını ve projeksiyonunu (u_Matrix'i hesaplamak için) hiçbir boşuna değiştirmeyi bile denedim. Herhangi bir fikir? V ve M'yi değiştirdiğinde ya da önce başka bir şey yapmak zorunda kaldığında, seninki hemen işe yaradı mı? – Navigateur

+0

Evet, doğru hatırlıyorsam hemen çalıştı. Belki de gölgelendiricinizle ilgili başka bir sorun var, ancak sadece doğru şeyleri yaptığınız durumlarda. OpenGL ile ilgili deneyimim gerçekten sınırlıdır. SO hakkında yeni bir soru göndermenizi öneriyorum. – MeanEYE