2013-11-10 3 views
0

Я реализую opengl-es для android. И я встретил странную картинку на nexus 4. Хотя на nexus-s все выглядит так, как я ожидаю. Вот мой Renderer код:Странное изображение opengl-es на nexus 4

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    Log.d(TAG, "onSurfaceChanged"); 
    if (height == 0) { 
     height = 1; 
    } 
    this.width = width; 
    this.height = height; 
    cellsh = height/cellSize; 
    cellsw = width/cellSize; 
    gl.glViewport(0, 0, width, height); // Reset The Current Viewport 
    gl.glMatrixMode(GL10.GL_PROJECTION); // Select The Projection Matrix 
    gl.glLoadIdentity(); // Reset The Projection Matrix 
    gl.glDisable(GL10.GL_DEPTH_TEST);// disable Z coordinate 
    gl.glOrthof(0f, width, height, 0, 0, 1); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); // Select The Modelview Matrix 
    gl.glLoadIdentity(); 
} 


@Override 
public void onSurfaceCreated(GL10 gl, 
     javax.microedition.khronos.egl.EGLConfig config) { 
    Log.d(TAG, "onSurfaceCreated"); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

} 
public void onDrawFrame(GL10 gl) { 

    gl.glLoadIdentity(); 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
    gl.glTranslatef(cellSize/2, cellSize/2, 0f); 
    for (int i = 0; i < cellsw; i++) { 
     for (int j = 0; j < cellsh; j++) { 
      if (Cells.firstGen()) { 
       if (Cells.getCell(j, i)) { 
        Coloriry(gl, 2); 
       } else { 
        Coloriry(gl, 1); 
       } 
       gl.glScalef(squareSize/2f, squareSize/2f, 1f); 
       quad.draw(gl); // Draw triangle (NEW) 
       gl.glScalef(1/(squareSize/2f), 1/(squareSize/2f), 1); 
       gl.glTranslatef(0.0f, cellSize, 0.0f); 
       continue; 
      } 
      if (Cells.getOldCell(j, i) != Cells.getCell(j, i)) { 
       if (Cells.getCell(j, i)) { 
        Coloriry(gl, 2); 
       } else { 
        Coloriry(gl, 1); 
       } 
       gl.glScalef(squareSize/2f, squareSize/2f, 1f); 
       quad.draw(gl); 
       gl.glScalef(1/(squareSize/2f), 1/(squareSize/2f), 1); 
      } 
      gl.glTranslatef(0.0f, cellSize, 0.0f); 
     } 
     gl.glTranslatef(cellSize, -cellsh * cellSize, 0.0f); 
    } 

    Cells.nextGen(); 

    frames += 1; 
} 

А вот скриншоты из Nexus S и Nexus 4. Nexus4 Nexus S

+0

Видеооборудование вашего устройства, похоже, находится в странном состоянии. Можете ли вы воспроизвести результаты после перезагрузки устройства? Вы проверили все коды возврата из функций GL в порядке? – LumpN

+0

точно повторяются шаблоны. Похоже, что что-то не так с памятью. Но другие приложения opengl-es выглядят отлично. Я думаю, проблема в некоторой внутренней реализации opengl, потому что, например, если я перетаскиваю верхний ящик, я вижу часы на фоне моего рендеринга и других элементов системы ui ... :) И никакой ошибки в связи с нексусом S – swex

+0

проблема уходит, если я помещаю gl.glClear (GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); to OnDrawFrame(), но что я могу сделать, если я не хочу перерисовывать весь экран в каждом кадре? Что делать, если я хочу перерисовать только измененные квадраты? – swex

ответ

0

Я думаю, что неприятности в вашей системе координат. Ширина, высота, cellsh, cellsw, float cellSize? Как вы их вычисляете? Какая целевая ап?

+0

Target API - это 7. this.width = width; this.height = height; cellsh = height/cellSize; cellsw = width/cellSize; – swex

0

некрасиво Nexus 4 картинка фиксируется путем добавления

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

к началу onDrawFrame. Но теперь я не знаю, как рисовать только измененные регионы, а не весь экран.

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