Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8635615
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 12, 20262026-06-12T10:01:09+00:00 2026-06-12T10:01:09+00:00

I am trying to make an application that will show text using OpenGL. I

  • 0

I am trying to make an application that will show text using OpenGL. I get unexpected behavior when I try to use Matrix.translateM to move specified object to a specific position. All other transformation matrices work as I would expect them to.

This is what I get when I call Matrix.translateM(model_matrix, 0, -1.0f, 0, 0):
result image

This is the image without translation:
enter image description here

This is my renderer code.

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

And this is my draw code for text.

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

Scaling and rotating work as expected but I can’t figure out why translate doesn’t.
Please note that I didn’t use OpenGL until recently.

I was expecting for translateM to move text to the left, not ‘rotate’ it.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-12T10:01:10+00:00Added an answer on June 12, 2026 at 10:01 am

    Order of variables when calculating gl_Position is important! World matrix goes first and then vertex coordinates. When asking question I did know this, but didn’t pay attention since shader code is taken from the Android OpenGL tutorial. Be ware folks. Tutorial is not correct!

    Correct shader code:

        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
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm trying to make a spellcheck function in my application that will show a
I'm trying to make a simple PyQT4 application that will let me show the
I am trying to make a simple Windows Form application that will show different
I am trying to make an application that will fill in the info i
I am trying to make an alarm application that will take ‘n’ number of
I am trying to make a desktop application that will be hidden but will
I'm trying to make an auto shutdown application that will shutdown the computer when
I want to make application such that,when user opens application,it will show a google-map
I am trying to make a scanning application. That application will scan the document
I've got a problem with DCs. I'm trying to make an application that will

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.