Android模拟器OpenGL远飞机距离

时间:2011-12-21 14:29:12

标签: android opengl-es android-emulator

我正试图在Android上的OpenGl中渲染一个简单的方块。相同的代码在真实设备上表现正确,但在仿真器上,正方形变形。这只发生在我使用高zFar值时(在此示例中,它的zNear = 80000,zFar = 80100)并且不依赖于zNear和zFar之间的距离。深度测试被禁用,因此我认为它与深度缓冲区没有任何关系。

这是它在真实设备上的外观:

http://imgur.com/9246P

这就是它在模拟器上的外观。

http://i.imgur.com/L0IKv.png

当正方形旋转时,变形变得更加明显,并且在某个时刻,正方形消失,然后再次出现。

我知道模拟器使用OpenGl的不同实现,也许这是一个bug? 有人知道它为什么会这样吗?

public class SquareTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        GLSurfaceView glView = new GLSurfaceView(this);
        glView.setRenderer(new SquareRenderer());

        setContentView(glView);
    }

    public class SquareRenderer implements Renderer {
        private final float[] verts = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.0f };
        private final int nrOfVerts = verts.length / 3;
        private FloatBuffer vertBuf;

        private float rotation;

        public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

            gl.glDisable(GL10.GL_DEPTH_TEST);

            gl.glColor4f(1, 0, 0, 1);

            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(verts.length * Float.SIZE / 8);
            byteBuffer.order(ByteOrder.nativeOrder());
            vertBuf = byteBuffer.asFloatBuffer();
            vertBuf.put(verts);
            vertBuf.position(0);
        }

        public void onSurfaceChanged(GL10 gl, int width, int height) {
            gl.glViewport(0, 0, width, height);

            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glPushMatrix();
            gl.glLoadIdentity();
            GLU.gluPerspective(gl, 90, (float) width / height, 80000, 80100);
            gl.glMatrixMode(GL10.GL_MODELVIEW);
        }

        public void onDrawFrame(GL10 gl) {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

            gl.glLoadIdentity();
            GLU.gluLookAt(gl, 0, 0, 80050, 0, 0, 0, 0, 1, 0);
            gl.glRotatef(rotation, 0, 0, 1);
            gl.glScalef(80000, 80000, 1);

            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuf);
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, nrOfVerts);

            rotation ++;
        }
    }
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

我从你的代码中重现了效果,如果你将所有这些80000-ish数字除以10,问题就会消失。我怀疑模拟器的OpenGL实现是在内部使用定点运算,这会导致它挣扎数字那么大。如果它使用glFixed格式(S15.16),它将无法处理大于32768的数字。