2010-11-15 81 views
1

我在设置3D场景的2D ontop时设置Ortho视图时遇到了问题。尝试使用Ortho绘制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(); 
} 

和我建立了我的邻看法是这样的:

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 ontop?

+0

不是glOrtho ** bottom **和** top **的第三和第四个参数吗?如果是这样,你的价值观是不是倒置? – 2010-11-15 21:53:39

+0

@Martinho Fernandes:如果我这样做,我会认为top/left是0,0,bottom/right是100,100。但我认为这与它不起作用有什么关系,或者? – Espen 2010-11-15 21:58:00

+0

是的,这可能会像那样工作。但你的问题可能来自你的onSurfaceOrtho方法,因为你正在搞投影矩阵,并将其作为当前模式,然后重新绘制帧... – 2010-11-15 22:00:05

回答

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之前调用我的函数以获得ortho。

我不确定这是否存在性能问题,或者有什么我可以做的。我知道“完整的”OpenGL有列表,可以在这里帮助一下...

+0

性能没有问题,矩阵操作是绘图操作的正常部分。此外,如果您认为绘图速度较慢,则可以考虑使用VBO。 – fabspro 2012-05-02 13:22:22