【发布时间】:2010-11-17 00:23:12
【问题描述】:
我在设置正交视图以在 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() 中的代码是什么来清除我的屏幕?
我希望在调用设置 Ortho 视图之前绘制到视图的内容不会受到影响。我没有调用任何明确的清除位,但它似乎仍然清除了我的视图 - 它是 onSurfaceOrtho() 函数中的代码。
如何正确设置 2D Ortho 视图,以便在 3D 视图上绘制 2D?
【问题讨论】:
-
glOrtho的第三个和第四个参数不是分别bottom和top吗?如果是这样,你的价值观不是倒置了吗?
-
@Martinho Fernandes:如果我这样做,我希望上/左为 0,0,下/右为 100、100。但我认为这与为什么它不起作用没有任何关系,或者?
-
是的,这可能会像那样工作。但是您的问题可能来自您的 onSurfaceOrtho 方法,因为您在重绘框架之前搞砸了投影矩阵并将其保留为当前模式...
-
@Martinho Fernandes:我认为 glPushMatrix 和 glPopMatrix 会“防止”...?
-
glPush 和 PopMatrix 不会保存 MatrixMode。有两个独立的矩阵堆栈:一个用于投影矩阵(至少 2 个深度),一个用于模型视图矩阵(我认为它有 32 个深度)。