OpenGL ES 1.0 到 OpenGL ES 2.0,我不能画正方形

OpenGL ES 1.0 to OpenGL ES 2.0, I cant draw a square

我正在学习 open GL ES 2.0,我刚刚为 1.0 制作了 1 个简单的游戏

我正在学习教程,但我无法理解这件事

在 OpenGL ES 1.0 中,如果我这样定义正方形:

private float[] vertices = { // Vertices for a face
0.0f, 0.0f, 0.2f, // 0. left-bottom-front
1.0f, 0.0f, 0.2f, // 1. right-bottom-front
0.0f, 1.0f, 0.2f, // 2. left-top-front
1.0f, 1.0f, 0.2f // 3. right-top-front
};

并按照这种方式绘制它有效

public void draw(GL10 gl)
{

    gl.glFrontFace(GL10.GL_CCW); // Front face in counter-clockwise
                                    // orientation
    gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
    gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable
                                                            // texture-coords-array
                                                            // (NEW)
    gl.glTexCoordPointer(3, GL10.GL_FLOAT, 0, texBuffer); // Define
                                                            // texture-coords
                                                            // buffer (NEW)

    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    // front
    gl.glBindTexture(GL10.GL_TEXTURE_2D,TextureLoader.TeclaBlancatextureIDs[0]);


    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Disable
                                                            // texture-coords-array
                                                            // (NEW)
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
    gl.glDisable(GL10.GL_BLEND);
}

但在 OpenGL ES 2.0 中,如果我这样做(使用相同的顶点),它只会写一个三角形:

private void drawSuelo(Suelo suelo)
{       
    // Pass in the position information
    suelo.mPositions.position(0);       
    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
            0, suelo.mPositions);        

    GLES20.glEnableVertexAttribArray(mPositionHandle);        

    // Pass in the color information
    suelo.mColors.position(0);
    GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false,
            0, suelo.mColors);        

    GLES20.glEnableVertexAttribArray(mColorHandle);

    // Pass in the normal information
    cubo.mCubeNormals.position(0);
    GLES20.glVertexAttribPointer(mNormalHandle, mNormalDataSize, GLES20.GL_FLOAT, false, 
            0, cubo.mCubeNormals);

    GLES20.glEnableVertexAttribArray(mNormalHandle);

    // This multiplies the view matrix by the model matrix, and stores the result in the MVP matrix
    // (which currently contains model * view).
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);   

    // Pass in the modelview matrix.
    GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0);                

    // This multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix
    // (which now contains model * view * projection).
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

    // Pass in the combined matrix.
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);

    // Pass in the light position in eye space.        
    GLES20.glUniform3f(mLightPosHandle, mLightPosInEyeSpace[0], mLightPosInEyeSpace[1], mLightPosInEyeSpace[2]);

    // Draw the cube.
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);                               
}   

似乎需要所有这些顶点才能绘制正方形

final float[] PositionData = {

// Top face
-1.0f, 1.0f, -1.0f, 
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f, 
-1.0f, 1.0f, 1.0f, 
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f };

为什么会这样?为什么我不见了? Open GL ES 2.0有什么方法可以写出4个顶点的正方形吗?

您正在使用不同的原始类型。在工作的 ES 1.0 代码中,你有这个:

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

在 ES 2.0 代码中,当你给它 4 个顶点时只渲染一个三角形:

GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);

因此在 ES 1.0 代码中,您指定要绘制具有 4 个顶点的三角形带(原始类型 GL_TRIANGLE_STRIP)。这对应于 2 个三角形。而在 ES 2.0 代码中,你指定要绘制 2 个单独的三角形(原始类型 GL_TRIANGLES),这确实需要 6 个顶点。

如果您想为 ES 2.0 代码使用原始的 4 个顶点,您只需使用与您在 ES 1.0 版本中使用的相同基元类型的等效绘图调用:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);