Java OpenGL未按预期进行渲染

Java OpenGL未按预期进行渲染,java,android,opengl-es,Java,Android,Opengl Es,如果我有以下屏幕设置 gl.glViewport(0,0,width,height); //Reset the current viewport gl.glMatrixMode(GL10.GL_PROJECTION); //select the projection matrix gl.glLoadIdentity(); //Reset the Projection Matrix gl.glOrthof(0f,1f,0f,1f,-1f,1

如果我有以下屏幕设置

    gl.glViewport(0,0,width,height);  //Reset the current viewport
    gl.glMatrixMode(GL10.GL_PROJECTION); //select the projection matrix
    gl.glLoadIdentity();            //Reset the Projection Matrix

    gl.glOrthof(0f,1f,0f,1f,-1f,1f);
顶点的设置如下所示

this._vertices=new float[]{
                0.0f,0.5f,0.0f,   //V1 bottom left
                0.0f,1.0f,0.0f,    //V2 top left
                0.5f,0.5f,0.0f,  //V3 Bottom right
                0.5f,1.0f,0.0f   //V4 top right
        };
那么当我画画的时候

gl.glTranslatef(0.0f,0.0f,0.0f);
它将正方形放在左上角(我以为0,0是左下角?)

然后

gl.glTranslatef(0.5f,-0.5f,0.0f);

把正方形放在屏幕中间(暗示底部实际上是-1.0F而不是0.0F)

如何使屏幕的左下角从0,0开始

更新------

我发现如果我改变路线

gl.glOrthof(0f,1f,0f,1f,-1f,1f);

然后没有任何变化(即左上角仍然为0,0,左下角为0,-1)


但是,如果我完全不使用该行,则原点位于屏幕的中心(即左上角为-1,-1)

使用
glOrthof
创建屏幕坐标系,因为它的输入参数是左、右、上和下,我无法理解混淆的地方。如果您希望左上角是(0,0)点,则只需将“上”和“左”参数设置为零,将“下”和“右”参数设置为一些正值,使正X向右,正Y向下

使用
glOrthof
的一些非常常见的情况是:

  • 在左上角插入
    (0,0)
    ,在右下角插入
    (屏幕高度、屏幕宽度)
    的位置查看坐标系。但在相当多的情况下,左下角位于
    (0,0)
  • 图形坐标系,屏幕中心位于
    (0,0)
    ,左上角位于
    (1,-1)
    ,右下角位于
    (-1,1)
  • 标准化视图系统,屏幕中心位于
    (0,0)
    ,但高度与宽度相关,具体取决于屏幕比率。因此,左上角位于
    (-1,-(屏幕高度/屏幕宽度))
    ,右下角位于
    (1,屏幕高度/屏幕宽度)
您应该注意,只有在第一种和第三种情况下,您的正方形才会始终绘制为正方形,而不是矩形(其中
a/b=screenWidth/screenHeight
)。因此,选择最适合您的应用程序


您应该知道,
glOrthof
对于平移和缩放也非常有用。你不需要做一些奇怪的转换和缩放,只需更改
glOrthof
参数,就可以显示场景的某个部分。

我认为在计算机图形世界中(0,0)通常是左上角,而不是你在数学中可能学到的左下角。不知道这是否是可以更改的。
glTranslatef(0.0f,0.0f,0.0f)
完全没有用。您正在向每个方向平移0个单位。
glTranslatef(0.0f,0.0f,0.0f)
实际上什么都不做。在每个方向上平移坐标0.0个单位的平移矩阵归结为一个单位矩阵。当你用一个恒等矩阵乘以某个东西时,什么都不会改变。因此,如果使用
glTranslatef(0.0f,0.0f,0.0f)
您的四元组从Y=0.5开始,到Y=1.0结束。您需要转换它(0.0,-0.5,0.0),使您的四边形从左下角开始。
glTranslatef(0.5f,0.5f,0.0f)
实际上会将您的四边形完全推出屏幕。给定投影矩阵,视口将映射到(0,0)-(1,1)。您的四元组将从Y=1.0开始,在Y=1.5结束。是的,这是正确的。从技术上讲,它将当前矩阵乘以转换矩阵(这就是我之前提到的
glTranslatef(0.0f,0.0f,0.0f)
退化为单位矩阵的原因),但这就是最终结果。
gl.glOrthof(0f,1f,1f,0f,-1f,1f);