Android - 使用 openGL ES 绘制 3D 然后 2D
Posted
技术标签:
【中文标题】Android - 使用 openGL ES 绘制 3D 然后 2D【英文标题】:Android - Draw 3D then 2D with openGL ES 【发布时间】:2010-09-23 07:39:51 【问题描述】:在 openGL ES 中绘制一些 3d 内容后如何绘制 HUD(文本或位图)??
我试过这个:
private void switchTo2D(GL10 gl)
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
GLU.gluOrtho2D( gl, 0, getViewportWidth(), 0, getViewportHeight() );
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
有人知道如何在不破坏场景的情况下从透视切换到正交??
【问题讨论】:
你试过这个吗?它奏效了吗?为什么没有工作? 不,如果我尝试绘制 2D 东西,它看起来像这样:dl.dropbox.com/u/2024237/device.png 但当我不尝试切换到 Ortho 时,它看起来像这样:dl.dropbox.com/u/2024237/device2.png 更多来源:pastebin.com/HVhVYV8k 【参考方案1】:我找到了解决方案,但我忘记发布了 :) 抱歉
package at.bartinger.opengl;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.util.AttributeSet;
public class GLGameView extends GLSurfaceView implements GLSurfaceView.Renderer
public GLGameView(Context context)
super(context);
setRenderer(this);
public GLGameView(Context context, AttributeSet attrs)
super(context, attrs);
// TODO Auto-generated constructor stub
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
init(gl);
@Override
public void onDrawFrame(GL10 gl)
//Standard
gl.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );
gl.glViewport( 0, 0, getWidth(), getHeight() );
gl.glDisable( GL10.GL_DITHER );
gl.glEnable( GL10.GL_DEPTH_TEST );
gl.glEnable( GL10.GL_CULL_FACE );
//Set 3D
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
gluPerspective( gl);
draw3D(gl);
gl.glDisable( GL10.GL_CULL_FACE );
gl.glDisable( GL10.GL_DEPTH_TEST );
//Set 2D
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
gluOrtho2D(gl);
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
draw2D(gl);
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
public void init(GL10 gl)
public void draw2D(GL10 gl);
public void draw3D(GL10 gl);
/**
* Sets the projection to the ortho matrix
*/
public void gluOrtho2D(GL10 gl)
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
GLU.gluOrtho2D( gl, 0, getWidth(), 0, getHeight() );
/**
* Sets the projection to the perspective matrix
*/
public void gluPerspective(GL10 gl)
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
float aspectRatio = (float)getWidth() / getHeight();
GLU.gluPerspective( gl, 67, aspectRatio, 1, 100 );
/**
* Sets the projection to the perspective matrix
*/
public void gluPerspective(GL10 gl, float near, float far)
gl.glMatrixMode( GL10.GL_PROJECTION );
gl.glLoadIdentity();
float aspectRatio = (float)getWidth() / getHeight();
GLU.gluPerspective( gl, 67, aspectRatio, near, far );
/**
* Sets the projection to the model view matrix
*/
public void gluLookAt(GL10 gl,
float positionX, float positionY, float positionZ,
float zentrumX, float zentrumY, float zentrumZ,
float upX, float upY, float upZ )
gl.glMatrixMode( GL10.GL_MODELVIEW );
gl.glLoadIdentity();
GLU.gluLookAt( gl,positionX, positionY, positionZ, zentrumX, zentrumY, zentrumZ, upX, upY, upZ );
【讨论】:
以上是关于Android - 使用 openGL ES 绘制 3D 然后 2D的主要内容,如果未能解决你的问题,请参考以下文章