Android OpenGL es“glDrawTexfOES”颠倒了

时间:2012-04-02 23:09:54

标签: android opengl-es drawing 2d

我正在使用OpenGL for Android来绘制我的2D图像。

每当我使用代码绘制一些东西时:

    gl.glViewport(aspectRatioOffset, 0, screenWidth, screenHeight);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();

    GLU.gluOrtho2D(gl, aspectRatioOffset, screenWidth + aspectRatioOffset,screenHeight, 0);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, myScene.neededGraphics.get(ID).get(animationID).get(animationIndex));

    crop[0] = 0;
    crop[1] = 0;
    crop[2] = width;
    crop[3] = height;
    ((GL11Ext)gl).glDrawTexfOES(x, y, z, width, height)

我得到了一个颠倒的结果。我看到人们通过这样做来解决这个问题:

    crop[0] = 0;
    crop[1] = height;
    crop[2] = width;
    crop[3] = -height;

然而,这确实损害了我的应用程序中的逻辑,因此我希望结果不会颠倒过来。有谁知道它为什么会发生,以及任何避免或解决它的方法?

编辑:我找到了一个解决方案,但我不知道它是否是一个好的解决方案:

    int[] crop = new int[4];
    crop[0] = 0;
    crop[1] = imageDimension[ID][1];
    crop[2] = imageDimension[ID][0];
    crop[3] = -imageDimension[ID][1];

    ((GL11)gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop, 0);
    ((GL11Ext)gl).glDrawTexfOES(x, ScreenHeight - y - height, 0, width, height);

1 个答案:

答案 0 :(得分:3)

定义颠倒。 OpenGL将(0,0)定义在显示的左下方,y向上。 glDrawTexOES被明确定义为在窗口坐标中工作,因此即使在ES 1.0中也没有矩阵堆栈。如果您设置了投影或模型视图矩阵以将坐标翻转到OpenGL认为的任何内容,那么在调用glDrawTexOES期间这不会产生任何影响。

通常情况下,人们在加载时会隐式翻转图形(因为它们忽略了OpenGL的原点位置),导致它们在使用glDrawTexOES时显得颠倒。正确的解决方案是,如果您不希望以后手动翻转坐标,则在加载图像和/或设置矩阵堆栈时不要隐式翻转它们。