2012-10-03 14 views
6

के साथ परिणाम प्राप्त नहीं हो रहा है। मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जो ओपनजीएल का उपयोग करके टेक्स्ट दिखाएगा। निर्दिष्ट ऑब्जेक्ट को किसी विशिष्ट स्थिति में स्थानांतरित करने के लिए Matrix.translateM का उपयोग करने का प्रयास करते समय मुझे अप्रत्याशित व्यवहार मिलता है। अन्य सभी परिवर्तन मैट्रिस काम करते हैं क्योंकि मैं उन्हें उम्मीद करता हूं। result imageएंड्रॉइड ओपनजीएल ईएस 2.0: मैट्रिक्स.ट्रैस्लेट एम

इस अनुवाद के बिना छवि है::

यह जब मैं Matrix.translateM(model_matrix, 0, -1.0f, 0, 0) फोन मैं क्या मिलता है enter image description here

यह मेरा रेंडरर कोड है।

@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); 
} 

और यह टेक्स्ट के लिए मेरा draw कोड है।

// 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); 

Shaders:

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);" + 
      "}" 
     ); 

स्केलिंग और घूर्णन काम के रूप में की उम्मीद है, लेकिन मैं समझ नहीं क्यों अनुवाद नहीं करता है। कृपया ध्यान दें कि मैंने हाल ही में ओपनजीएल का उपयोग नहीं किया है।

मैं translateM के लिए बाईं ओर पाठ को स्थानांतरित करने की उम्मीद कर रहा था, इसे 'घुमाएं' नहीं।

+0

यह कैसा दिखाई माना जाता है? आपने क्या उम्मीद किया? इसके अलावा, क्या आप अपने शेडर्स दिखा सकते हैं। – Tim

+0

@ टिम सुनिश्चित करें। विवरण की कमी के लिए खेद है। मैंने शेडर कोड और छवि को 'translateM' के बिना दिखने के तरीके को जोड़ा है। मैं छवि को बाईं ओर ले जाने के लिए 'translateM' की अपेक्षा कर रहा था। – MeanEYE

+0

आह, क्षमा करें। अब समस्या मिली है कि मेरे पास शेडर कोड पर दूसरा नजरिया था। :) धन्यवाद। – MeanEYE

उत्तर

11

gl_Position की गणना करते समय चर के क्रम महत्वपूर्ण हैं! विश्व मैट्रिक्स पहले और फिर वर्टेक्स निर्देशांक चला जाता है। सवाल पूछते समय मुझे यह पता चला, लेकिन एंड्रॉइड ओपनजीएल ट्यूटोरियल से शेडर कोड लेने के बाद से ध्यान नहीं दिया। लोगों के लिए सावधान रहें। ट्यूटोरियल सही नहीं है!

सही शेडर कोड:

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

सबसे भयानक बात यह है कि यदि आप साधारण आकार खींचते हैं तो यह बग अदृश्य है और जब आप जटिल आकार खींचेंगे तो विनाशकारी होगा। मतलब के लिए धन्यवाद !!! –

+0

मुझे एक ही समस्या है लेकिन आपका समाधान केवल मेरे लिए शेडर को दुर्घटनाग्रस्त कर देता है। जब मैं 'gl_position = a_Position * u_Matrix' करता हूं तो मैं केवल चीज़ों को प्रस्तुत करने के लिए प्राप्त कर सकता हूं। मैंने किसी भी लाभ के लिए दृश्य और प्रक्षेपण ('u_Matrix' की गणना करने के लिए) के गुणात्मक क्रम को बदलने का भी प्रयास किया। कोई विचार? जब आपने वी और एम को बदल दिया तो क्या आपने तुरंत काम किया था या आपको पहले कुछ और करना पड़ा था? – Navigateur

+0

हाँ अगर मैं सही ढंग से याद करता हूं तो यह तुरंत काम करता है। शायद आपके शेडर के साथ कुछ और गड़बड़ है लेकिन केवल मामलों में जब आप सही काम करते हैं। ओपनजीएल के साथ मेरा अनुभव वास्तव में सीमित है। मैं सुझाव देता हूं कि एसओ पर एक नया प्रश्न पोस्ट करें। – MeanEYE

संबंधित मुद्दे