views:

47

answers:

2

I'm attempting to draw in orthographic mode with OpenGL ES, and the point (0,0) is in the lower-left corner of the screen. However, I want to make it be in the upper-left hand corner.

Here's where I'm setting things up in my Android app:

public void onSurfaceChanged(final GL10 gl, final int width, final int height) {
    assert gl != null;

    // use orthographic projection (no depth perception)
    GLU.gluOrtho2D(gl, 0, width, 0, height);
}

I tried changing the above call in many ways, including:

    GLU.gluOrtho2D(gl, 0, width, 0, height);
    GLU.gluOrtho2D(gl, 0, width, 0, -height);
    GLU.gluOrtho2D(gl, 0, width, height, 0);
    GLU.gluOrtho2D(gl, 0, width, -height, 0);

I also tried playing with the viewport to no avail:

public void onSurfaceChanged(final GL10 gl, final int width, final int height) {
    assert gl != null;

    // define the viewport
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();

    // use orthographic projection (no depth perception)
    GLU.gluOrtho2D(gl, 0, width, 0, height);
}

And again, I tried playing with the viewport settings to no avail:

    gl.glViewport(0, 0, width, height);
    gl.glViewport(0, 0, width, -height);
    gl.glViewport(0, height, width, 0);
    gl.glViewport(0, -height, width, 0);

Any clues on how to get the point (0,0) to the top-left of the screen? Thanks!

+1  A: 

How about glScalef(1f, -1f, 1f); ?

Ben Voigt
glScalef should be used for scaling, not fixing the coordinate projection.
Sean Farrell
How do you think `gluOrtho2D` works? It adjusts the projection matrix of course, same thing `glScale` changes.
Ben Voigt
A: 

How about:

glViewport(0, 0, width, height);
gluOrtho2D(0, width, height, 0);

The glViewport call only sets the viewport in device coordinates. That is that of your window system. The glOrtho (gluOrtho2D) calls sets the coordinate mapping from world coordinates to device coordinates.

See:

Sean Farrell