【问题标题】:Trying to use Ortho for drawing 2D尝试使用 Ortho 绘制 2D
【发布时间】: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的第三个和第四个参数不是分别bottomtop吗?如果是这样,你的价值观不是倒置了吗?
  • @Martinho Fernandes:如果我这样做,我希望上/左为 0,0,下/右为 100、100。但我认为这与为什么它不起作用没有任何关系,或者?
  • 是的,这可能会像那样工作。但是您的问题可能来自您的 onSurfaceOrtho 方法,因为您在重绘框架之前搞砸了投影矩阵并将其保留为当前模式...
  • @Martinho Fernandes:我认为 glPushMatrix 和 glPopMatrix 会“防止”...?
  • glPush 和 PopMatrix 不会保存 MatrixMode。有两个独立的矩阵堆栈:一个用于投影矩阵(至少 2 个深度),一个用于模型视图矩阵(我认为它有 32 个深度)。

标签: android opengl-es


【解决方案1】:

因此,在 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 有一些列表可以在这里提供一些帮助......

【讨论】:

  • 性能没有问题,矩阵运算是绘图运算的正常部分。另外,如果你认为你的绘图很慢,你可以考虑使用 VBO。
猜你喜欢
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2022-08-11
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多