Android Emulator与手机opengl不一致

时间:2011-02-09 14:12:19

标签: android opengl-es

我遇到问题我的应用程序在我的模拟器上看起来正确,但在我的手机上它只显示我的场景片段。

图片here(模拟器是右边的那个。

我的渲染器代码可以在这里看到。 (这个类是抽象的,但所有实现类都在绘制多边形)

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 个答案:

答案 0 :(得分:1)

这是一个深度缓冲问题:来自glFrustum手册页的“注释”部分:

  

near必须永远不要设置为0。

你应该计算尽可能远离相机的近似值,并尽可能接近远,同时仍然包含你想要绘制的东西。