Различия в буфере глубины между версиями Android, использующими OpenGL ES 1.1 - PullRequest
0 голосов
/ 13 сентября 2011

Я пишу двумерную игру в OpenGL ES 1.0 (с приращениями к 1.1 Расширениям, где это применимо). Я стараюсь сделать это как можно более универсальным на случай, если пропустил что-то очевидное.

У меня проблема с глубинным тестированием между Android 2.2 (Froyo) и Android 2.3.3 (Gingerbread). В настоящее время на создание у меня следующее:

//this is called once only when the renderer is created
gl.glClearDepthf(1.0f);                     
gl.glEnable(GL10.GL_DEPTH_TEST);            
gl.glDepthFunc(GL10.GL_LEQUAL); 
gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity();                    
gl.glOrthof(0, mWidth, 0, mHeight, 1.0f, 320.0f);

Я успешно использую буфер глубины при использовании расширения OES_draw_texture, и это не проблема. Однако при указании значений Z для традиционного рисования вершин между версиями возникает любопытное расхождение.

В 2.2 следующий код отображается спереди (сверху):

//This array is used in the function glDrawArrays as a GL10.GL_TRIANGLE_STRIP.
//It works as intended. The specific positions are the Z positions of each point in
//the square (the triangle strips form a square).
vertices[2]=0.5f*(1+320)*-1; 
vertices[5]=0.5f*(1+320)*-1; 
vertices[8]=0.5f*(1+320)*-1; 
vertices[11]=0.5f*(1+320)*-1; 

Теперь это прекрасно работает, но в 2.3.3 это отодвинет объект дальше. Чтобы получить правильную позицию с помощью 2.3.3, мне нужно сделать следующее:

vertices[2]=-1; 
vertices[5]=-1; 
vertices[8]=-1; 
vertices[11]=-1; 

Это исправит проблему.

У меня вопрос двоякий:

  • Почему я должен указывать значения Z как -ve вместо + ve, если я указал буфер глубины в диапазоне от 1 до 320? В стандартной (хотя и не-ES) документации четко указано, что zNear и zFar не должны быть -ve или 0.
  • Почему существует несоответствие между 2.2 и 2.3.3 таким образом? У меня сложилось впечатление, что 2.3.3 делает это «правильно», имея 1 в качестве значения около , что я и ожидал. Почему тогда фактически половина буфера глубины игнорируется?

Я подозреваю, что я могу пропустить определенную команду, которую Gingerbread принимает неявно, а Froyo - нет, но я не уверен. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 сентября 2011

gl.glOrthof не действует в ES 2.0, так как в нем больше нет концепции проекционной матрицы. Возможно, вы захотите использовать android.opengl.Matrix.orthoM для вычисления матрицы проекции, а затем умножить свои точки на нее в вершинном шейдере, например:

attribute vec3 position;
uniform mat4 projection;
void main() {
    gl_Position = projection * vec4(position, 1.);
}

Позиции, назначенные gl_Position, находятся в «координатах клипа», которые находятся в диапазоне -1..1 в каждом измерении. Похоже, вы назначаете gl_Position из данных вершин, не масштабируя их от требуемого zNear..zFar до -1..1.

...