квадрат в opengl заполняет весь дисплей - PullRequest
2 голосов
/ 28 декабря 2010

, если предположить, что некоторые ветераны opengl теперь могут сойти лицом в лицо: -)

Я работаю над игрой на основе плиток (только 2D) на Android с открытыми глазами.

После нескольких дней знакомства с основами opengl я все еще не знаю, как сохранить связь между объектом и размером экрана.

Чтобы быть конкретным: мой мобильный дисплей имеет разрешение 480х800 пикселей. Когда я указываю простой квадрат с его следующими размерами, он заполняет весь экран (?):

объектные вершины:

float vertices[] = { -1.0f, -1.0f, 0.0f, // 0, Top Left
    1.0f, -1.0f, 0.0f, // 1, Bottom Left
    1.0f, 1.0f, 0.0f, // 2, Bottom Right
    -1.0f, 1.0f, 0.0f // 3, Top Right
};

short[] indices = { 0, 1, 2, 2, 3, 0 };

onSurfaceCreated:

   public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {

gl.glMatrixMode(GL10.GL_PROJECTION);

    gl.glLoadIdentity();
    gl.glEnable(GL10.GL_BLEND);

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_TEXTURE_2D);

    GLU.gluOrtho2D(gl, 0, Shared.dm.widthPixels, Shared.dm.heightPixels, 0);

onDrawFrame:

   @Override
    public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // Replace the current matrix with the identity matrix
    gl.glLoadIdentity();

    //Move this only
    gl.glPushMatrix();
    Log.d(Shared.LOGTAG, "X: " + offset.x + "Y: " + offset.y);
    gl.glTranslatef(offset.x, offset.y, 0);
    root.draw(gl);
    gl.glPopMatrix();
    }

Может кто-нибудь дать мне подсказку в правильном направлении? Я полагаю, это как-то связано с матрицами?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010

Типичное заблуждение новичков в OpenGL: они думают, что есть какая-то «однократная инициализация проецирования».

Обычно вы настраиваете целое состояние OpenGL заново каждый раз, когда начинаете рисовать вещи.Это также ловит ошибки, такие как случайная перезапись матриц проекции.

onSurfaceCreated:

public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
    // Just upload textures and shaders here.

onDrawFrame:

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // set everything just right before you need it
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, 0, Shared.dm.widthPixels, Shared.dm.heightPixels, 0);

    // order in which different matrices are set is not important,
    // but order in which each matrix is manipulated is!
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    // enable and configure blending on a as-needed base
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_TEXTURE_2D);

    //Move this only
    // make sure this is operating really on the modelview matrix
    // redundant in this rather simple example, but in large codebases
    // inevitable.
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glPushMatrix();
    Log.d(Shared.LOGTAG, "X: " + offset.x + "Y: " + offset.y);
    gl.glTranslatef(offset.x, offset.y, 0);
    root.draw(gl);
    gl.glPopMatrix();
}
2 голосов
/ 28 декабря 2010

Похоже, это происходит из-за сброса матрицы проекции. Я вижу в onSurfaceCreated, вы звоните gluOrtho2D. Это нормально, но не похоже, что вы переключаетесь обратно с glMatrixModel(GL_MODELVIEW). Поэтому, когда glLoadIdentity вызывается в onDrawFrame, он сбрасывает вашу матрицу проекции.

Когда матрица проекта идентична, координаты просто передаются. -1 и +1 на оси X соответствуют левой и правой сторонам окна (соответственно). На оси Y это нижняя и верхняя часть окна. На оси Z это дальние и ближние плоскости отсечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...