2010-12-28 5 views
2

при условии, что некоторые OpenGL-ветераны могли FACEPALM :-) Теперьквадрат в OpenGL заполняет весь экран

Я работаю на tilebased игре (только 2D) на андроид с Open GL ES.

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

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

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

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

Типичное, неправильное представление, сделанное новичками 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(); 
} 
+0

Спасибо за подсказку/усилий, теперь есть небольшая площадь обнаружились :-) Хотя ответ Jay шатуны также весьма полезно , ваш намек переместил все матричные настройки в метод draw-in (в отличие от многих начинающих-уроков), и ваши комментарии коментариев очень помогли. –

2

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

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

Смежные вопросы