Android Emulator vs телефон opengl несоответствия - PullRequest
1 голос
/ 09 февраля 2011

У меня проблема с тем, что мое приложение выглядит прямо на моем эмуляторе, но на моем телефоне оно отображает только фрагмент моей сцены.

Изображения здесь (эмулятор справа).

Мой код рендерера можно увидеть здесь. (Этот класс абстрактный, но все, что делает реализующий класс, рисуют многоугольники)

public abstract class AbstractRenderer implements Renderer {
float x = 0.5f;
float y = 1f;
float z = 3;

boolean displayCoordinateSystem = true;

public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
    gl.glDisable(GL10.GL_DITHER);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glClearColor(.5f, .5f, .5f, 1);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glEnable(GL10.GL_DEPTH_TEST);
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
    float ratio = (float) w / h;
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-ratio, ratio, -1, 1, 0, 10);
}

public void onDrawFrame(GL10 gl) {
    gl.glDisable(GL10.GL_DITHER);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    GLU.gluLookAt(gl, x, y, z, 0f, 0, 0f, 0f, 1f, 0f);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    if(displayCoordinateSystem) {
        drawCoordinateSystem(gl);
    }

    draw(gl);

//      gl.glFlush();
}

private void drawCoordinateSystem(GL10 gl) {
    ByteBuffer vbb = ByteBuffer.allocateDirect(6*3*4);
    vbb.order(ByteOrder.nativeOrder());
    FloatBuffer vertices = vbb.asFloatBuffer();

    ByteBuffer ibb = ByteBuffer.allocateDirect(6*2);
    ibb.order(ByteOrder.nativeOrder());
    ShortBuffer indexes = ibb.asShortBuffer();

    final float coordLength = 27f;

    //add point (-1, 0, 0)
    vertices.put(-coordLength);
    vertices.put(0);
    vertices.put(0);

    //add point (1, 0, 0)
    vertices.put(coordLength);
    vertices.put(0);
    vertices.put(0);

    //add point (0, -1, 0)
    vertices.put(0);
    vertices.put(-coordLength);
    vertices.put(0);

    //add point (0, 1, 0)
    vertices.put(0);
    vertices.put(coordLength);
    vertices.put(0);

    //add point (0, 0, -1)
    vertices.put(0);
    vertices.put(0);
    vertices.put(-coordLength);

    //add point (0, 0, 1)
    vertices.put(0);
    vertices.put(0);
    vertices.put(coordLength);

    for(int i = 0; i < 6; i++) {
        indexes.put((short)i);
    }

    vertices.position(0);
    indexes.position(0);

    gl.glColor4f(1, 1, 0, 0.5f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
    gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);

    indexes.position(2);
    gl.glColor4f(0, 1, 0, 0.5f);
    gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);

    indexes.position(4);
    gl.glColor4f(0, 0, 1, 0.5f);
    gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);
}

protected abstract void draw(GL10 gl);
}

Я предполагаю, что я не устанавливаю какое-либо значение, которое установлено по умолчанию реализацией эмулятора. Единственное, что я понятия не имею, что это может быть за вещь.

Надеюсь услышать от вас парней и чуваков!

1 Ответ

1 голос
/ 10 февраля 2011

Это проблема буфера глубины: из раздела «Заметки» на странице справки glFrustum :

near никогда не следует устанавливать значение 0.

Вы должны рассчитать значение ближнего, чтобы оно было как можно дальше от камеры, а расстояние как можно ближе, насколько это возможно, при этом охватывая то, что вы хотите нарисовать.

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