Настройка окна просмотра для 2D-программирования OpenGL на Android - PullRequest
1 голос
/ 13 мая 2011

Я пытаюсь использовать OpenGL для 2D-программирования на Android. Прямо сейчас я на стадии установки; пытаясь настроить мой видовой экран. У меня есть текстуры загрузки и рисования, но у меня проблемы с тем, чтобы заставить их рисовать так, как я хочу. Если возможно, я хочу, чтобы источник находился в верхнем левом углу экрана, увеличиваясь вниз, так как именно так настраивается мой код (перенесенный с того времени, когда я ранее использовал холст). Я подумал, что это будет легко; что-то вроде перевода и переворачивания. Когда я попытался изменить операторы, которые конфигурируют область просмотра, я был удивлен, увидев, что, очевидно, они не влияют на мое приложение. См. Код ниже для метода onSurfaceChanged () объекта GLRenderer:

public void onSurfaceChanged(GL10 gl, int width, int height) {
    this.width = width;
    this.height = height;

    gl.glViewport(0, 0, width, height);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, 0, width, height, 0);
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
}

Я могу изменить эти значения или даже закомментировать эти строки (за исключением glColor4x), и графика все равно будет отображаться точно так же. Графика отображается в ожидаемом размере, без искажений и даже в правильном месте, если вы берете нижнюю левую координату за начало координат. Вот процедура рисования для моих текстур, как часть класса, представляющего один рисуемый объект:

public void draw(GL10 gl, float x, float y) {
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
    cropSignature = OpenGLUtil.setTextureCrop(gl,srcRectParam,cropSignature);
    ((GL11Ext)gl).glDrawTexfOES(x, y, 0, width, height);
}

Где x, y - координаты для рисования, а width, height - размеры текстуры, указанные при создании этого объекта.

Полностью ли glDrawTexfOES игнорирует установленные мной настройки области просмотра? Если так, как я должен рисовать? И как я могу установить начало OpenGL в верхнем левом углу, увеличивая вниз? Или это плохая практика, и я должен инвертировать остальную часть своего кода, чтобы соответствовать этому?

1 Ответ

4 голосов
/ 13 мая 2011

Измените его на что-то вроде этого:

// call only one time, when texture needs to be loaded
// (also sometimes neccesary after resuming a paused app)
public void loadTexture() {
    textureId = gl.glGenTextures(1);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
    cropSignature = OpenGLUtil.setTextureCrop(gl,srcRectParam,cropSignature);
}

public void onSurfaceChanged(GL10 gl, int width, int height) {
    this.width = width;
    this.height = height;
}

public void draw(GL10 gl, float x, float y) {
    gl.glViewport(0, 0, width, height);

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    if(origin_upper_left) {
        GLU.gluOrtho2D(gl, 0, width, 0, height);
    } else {
        GLU.gluOrtho2D(gl, 0, width, height, 0);
    }

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
    ((GL11Ext)gl).glDrawTexfOES(x, y, 0, width, height);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...