我正试图在Android上的OpenGl中渲染一个简单的方块。相同的代码在真实设备上表现正确,但在仿真器上,正方形变形。这只发生在我使用高zFar值时(在此示例中,它的zNear = 80000,zFar = 80100)并且不依赖于zNear和zFar之间的距离。深度测试被禁用,因此我认为它与深度缓冲区没有任何关系。
这是它在真实设备上的外观:
这就是它在模拟器上的外观。
当正方形旋转时,变形变得更加明显,并且在某个时刻,正方形消失,然后再次出现。
我知道模拟器使用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 ++;
}
}
}
提前致谢。
答案 0 :(得分:2)
我从你的代码中重现了效果,如果你将所有这些80000-ish数字除以10,问题就会消失。我怀疑模拟器的OpenGL实现是在内部使用定点运算,这会导致它挣扎数字那么大。如果它使用glFixed格式(S15.16),它将无法处理大于32768的数字。