OpenGL ES 2D坐标

时间:2011-06-20 06:58:45

标签: android opengl-es 2d

我正在尝试将我的GLSurfaceView设置为使用传统的2D坐标系。 基本上,我想把我的第一个磁贴放在0x0,它位于左上角。 但是,当我在0x0处绘制纹理时,它会在左下角绘制它。

我希望它从0x0开始,随着Y坐标的增加而下降。

以下是我正在初始化渲染器的方法:

gl.glClearColor(0f, 0f, 0f, 1);
gl.glViewport(0, 0, mViewWidth,mViewHeight); 
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();

GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0);

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glEnable(GL10.GL_BLEND);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_TEXTURE_2D);

我使用以下方式绘制纹理:

gl.glBindTexture(GL10.GL_TEXTURE_2D, mytexture);
((GL11Ext) gl).glDrawTexfOES(0, 32, 0, tile_width, tile_height);

任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:5)

它绘制在左下角,因为这是OpenGL定义视口原点的地方。要克服这个问题,必须在投影中镜像Y轴。很简单,只需交换glOrtho的 bottom top 参数。

GL.glOrtho(gl, 0, mViewWidth, mViewHeight, 0, -1, 1); // using GL. instead of GLU

答案 1 :(得分:2)

我能够通过@ datenwolf的评论来解决这个问题。

基本初始化是正确的,但是使用glDrawTexOES忽略了相机。 为了避免使用glDrawTex,我像往常一样加载纹理,但使用顶点缓冲区来绘制它们。

我使用了SpriteMethodTest android项目,其中包含有关如何正确加载它们的代码。 我只需要玩相机,现在一切正常。