我在设置用于在3D场景顶部绘制2D的正交视图时遇到麻烦。
我这样设置我的视图:
public void onSurfaceChanged( GL10 gl, int width, int height ) {
gl.glViewport( 0, 0, width, height );
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
GLU.gluPerspective( gl, 45.0f, ( ( float )width / ( float )height ), 0.1f, 100.0f );
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
}
我像这样设置了Ortho视图:
public void onSurfaceOrtho( GL10 gl ) {
gl.glOrthof( 0.0f, 100.0f, 100.0f, 0.0f, -0.1f, 0.1f );
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
}
然后我像这样画我的框架:
public void onDrawFrame( GL10 gl ) {
gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
gl.glLoadIdentity();
scene.onDrawFrame( gl );
gl.glPushMatrix();
onSurfaceOrtho( gl );
screen.onDrawFrame( gl );
gl.glPopMatrix();
}
场景和屏幕对象是3D和2D的图形对象。屏幕对象尚未绘制任何内容,因为我只是从2D Ortho视图开始。但是,场景对象会绘制一个立方体。因此一切正常,直到我为2D Ortho绘图添加新代码-从glPushMatrix()到glPopMatrix()。现在,除了我清晰的颜色之外,我什么都看不到。
那么onSurfaceOrtho()函数中的代码是什么清除了我的屏幕?
我希望在设置正交视图之前调用该视图所获得的内容不会被留下。我没有调用任何明确的清除位,但似乎仍然清除了我的视图-它是onSurfaceOrtho()函数中的代码。
如何正确设置2D正交视图,以便可以在3D视图的顶部绘制2D?
最佳答案
因此,我在Martinho Fernandes的一点帮助下找出了解决方法。
我设置了两个功能:
public void onSurfaceOrtho( GL10 gl ) {
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
gl.glOrthof( 0.0f, 100.0f, 0.0f, 100.0f, -0.1f, 0.1f );
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
}
public void onSurfacePerspective( GL10 gl ) {
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
GLU.gluPerspective( gl, 45.0f, aspect, 0.1f, 100.0f );
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
}
然后在绘制框架时:
public void onDrawFrame( GL10 gl ) {
gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
gl.glLoadIdentity();
onSurfacePerspective( gl );
scene.onDrawFrame( gl );
onSurfaceOrtho( gl );
screen.onDrawFrame( gl );
}
因此,对于每一帧,我必须在绘制3D之前调用我的函数来设置透视图,然后在绘制2D之前调用我的正交函数。
我不确定这是否存在性能问题,或者是否可以对此做某些事情。我知道“完整” OpenGL的列表在这里可以有所帮助...
关于android - 尝试使用Ortho绘制2D,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4189137/