Opengl es 打开GL ES 2.0绘制正方形

Opengl es 打开GL ES 2.0绘制正方形,opengl-es,glsl,shader,opengl-es-2.0,Opengl Es,Glsl,Shader,Opengl Es 2.0,我试图跟随Android开发人员使用OpenGL ES教程显示图形。 在第一部分中,我必须画一个三角形,它已经好了。现在,我应该使用一个square类来绘制一个正方形,该类可以按照教程进行定义。 当我尝试使用一种主要从Triangle类复制的draw方法进行绘制时,屏幕上只显示一个三角形,它是定义的正方形的一半,显然我已经注释掉了三角形。draw line 这是我的代码,有人有任何提示来解决吗 Square.java: public class Square { private Flo

我试图跟随Android开发人员使用OpenGL ES教程显示图形。 在第一部分中,我必须画一个三角形,它已经好了。现在,我应该使用一个square类来绘制一个正方形,该类可以按照教程进行定义。 当我尝试使用一种主要从Triangle类复制的draw方法进行绘制时,屏幕上只显示一个三角形,它是定义的正方形的一半,显然我已经注释掉了三角形。draw line

这是我的代码,有人有任何提示来解决吗

Square.java:

public class Square {

    private FloatBuffer vertexBuffer;
    private ShortBuffer drawListBuffer;

    private final int mProgram;

    private final String vertexShaderCode =
            "attribute vec4 vPosition;" +
                    "void main() {" +
                    "  gl_Position = vPosition;" +
                    "}";

    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform vec4 vColor;" +
                    "void main() {" +
                    "  gl_FragColor = vColor;" +
                    "}";

    // number of coordinates per vertex in this array
    static final int COORDS_PER_VERTEX = 3;
    static float squareCoords[] = {
            -0.5f,  0.5f, 0.0f,   // top left
            -0.5f, -0.5f, 0.0f,   // bottom left
            0.5f, -0.5f, 0.0f,   // bottom right
            0.5f,  0.5f, 0.0f }; // top right

    // Set color with red, green, blue and alpha (opacity) values
    float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };

    private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices

    public Square() {
        // initialize vertex byte buffer for shape coordinates
        ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(squareCoords);
        vertexBuffer.position(0);

        // initialize byte buffer for the draw list
        ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2);
        dlb.order(ByteOrder.nativeOrder());
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(drawOrder);
        drawListBuffer.position(0);

        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,
                vertexShaderCode);
        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,
                fragmentShaderCode);

        // create empty OpenGL ES Program
        mProgram = GLES20.glCreateProgram();

        // add the vertex shader to program
        GLES20.glAttachShader(mProgram, vertexShader);

        // add the fragment shader to program
        GLES20.glAttachShader(mProgram, fragmentShader);

        // creates OpenGL ES program executables
        GLES20.glLinkProgram(mProgram);
    }

    private int mPositionHandle;
    private int mColorHandle;

    private final int vertexCount = squareCoords.length / COORDS_PER_VERTEX;
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex

    public void draw() {
        // Add program to OpenGL ES environment
        GLES20.glUseProgram(mProgram);

        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);

        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                GLES20.GL_FLOAT, false,
                vertexStride, vertexBuffer);

        // get handle to fragment shader's vColor member
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

        // Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);

        // Draw the square
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

        // Disable vertex array
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }
}

您有4个顶点坐标,其排列如下:

static float squareCoords[] = {
   -0.5f,  0.5f, 0.0f,   // top left
   -0.5f, -0.5f, 0.0f,   // bottom left
    0.5f, -0.5f, 0.0f,   // bottom right
    0.5f,  0.5f, 0.0f }; // top right
此图案与基本体类型GL_TRIANGLE_FAN匹配,但与基本体类型GL_TRIANGLES不匹配

更改原语类型以解决您的问题:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, vertexCount);
注意:对于基本类型GL_三角形,您需要6个顶点坐标,例如,具有以下排列:

0  3      5
 x x-----x
 | \ \   |
 |   \ \ |
 x-----x x 
1      2  4
基本类型GL_三角形与索引缓冲区匹配:

private short drawOrder[] = { 0, 1, 2, 0, 2, 3 };
如果要从索引列表中绘制基本体,则必须使用:

您有4个顶点坐标,其排列如下:

static float squareCoords[] = {
   -0.5f,  0.5f, 0.0f,   // top left
   -0.5f, -0.5f, 0.0f,   // bottom left
    0.5f, -0.5f, 0.0f,   // bottom right
    0.5f,  0.5f, 0.0f }; // top right
此图案与基本体类型GL_TRIANGLE_FAN匹配,但与基本体类型GL_TRIANGLES不匹配

更改原语类型以解决您的问题:

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, vertexCount);
注意:对于基本类型GL_三角形,您需要6个顶点坐标,例如,具有以下排列:

0  3      5
 x x-----x
 | \ \   |
 |   \ \ |
 x-----x x 
1      2  4
基本类型GL_三角形与索引缓冲区匹配:

private short drawOrder[] = { 0, 1, 2, 0, 2, 3 };
如果要从索引列表中绘制基本体,则必须使用:


谢谢,我可以使用:glDrawerElements解决问题谢谢,我可以使用:glDrawerElements解决问题