(GLES20) Как правильно использовать VBO?

Я действительно новичок в программировании OpenGL (в частности, GLES20), поэтому, пожалуйста, терпите меня. Я пытаюсь сделать простой квадрат без использования VBO в GLES20, и он отлично работает, он рисует цветной квадрат, но почему-то, когда я использую VBO (который я предпочитаю), квадрат не рисовал. Я все еще изучаю программирование OpenGL, поэтому я не совсем понимаю большую часть этого. Может ли кто-нибудь объяснить и предоставить мне несколько кодов, как правильно использовать VBO? Заранее спасибо!

вот квадратный класс для справки:

      public class Square2
{
        private float[] vertexArray = {
                //Vertices                                  //Color
                0.5f, -0.5f, 0.0f,                  1.0f, 0.0f, 0.0f, 1.0f, //Bottom right 0
                -0.5f, 0.5f, 0.0f,                  0.0f, 1.0f, 0.0f, 1.0f, //top left       1
                0.5f, 0.5f, 0.0f,                       0.0f, 0.0f, 1.0f, 1.0f, //top right      2
                -0.5f, -0.5f, 0.0f,                 1.0f, 1.0f, 0.0f, 1.0f //bottom left     3
        };
    
        private short[] elementArray = {
                2,1,0, //top right triangle
                0,1,3  //bottom left triangle
        };

        private int shaderProgram;
    
        FloatBuffer vertexBuffer;
    
        ShortBuffer elementBufer;

        private int[] vboID = new int[2];

        private int positionSize;

        private int colorSize;

        private int floatBytes;

        private int vertexSizeBytes;

        private int mMVPMatrixHandle;

        private int mPositionHandle;

        private int mColorHandle;

        public Square2() {
            
                final String vertexShaderSrc =
                        "uniform mat4 u_MVPMatrix;      \n"

                        + "attribute vec4 a_Position;     \n"
                        + "attribute vec4 a_Color;        \n"

                        + "varying vec4 v_Color;          \n"

                        + "void main()                    \n"
                        + "{                              \n"
                        + "   v_Color = a_Color;          \n"
                        + "   gl_Position = u_MVPMatrix   \n"
                        + "               * a_Position;   \n"
                        + "}";
                    
                final String fragmentShaderSrc =
                        "precision mediump float;       \n"                                                 
                        + "varying vec4 v_Color;          \n"
                        + "void main()                    \n"
                        + "{                              \n"
                        + "   gl_FragColor = v_Color;     \n"
                        + "}";
            
                //Create float buffer           
                vertexBuffer = ByteBuffer.allocateDirect(vertexArray.length * 4)
                        .order(ByteOrder.nativeOrder()).asFloatBuffer();
        vertexBuffer.put(vertexArray).position(0);
            
                GLES20.glGenBuffers(2, vboID, 0);
                GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboID[0]);
                GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexArray.length * 4, vertexBuffer, GLES20.GL_STATIC_DRAW);

                //Create ShortBuffer
                elementBufer = ByteBuffer.allocateDirect(elementArray.length * 2)
                        .order(ByteOrder.nativeOrder()).asShortBuffer();
        elementBufer.put(elementArray).position(0);
            
                GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, vboID[1]);
                GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, elementArray.length * 2, elementBufer, GLES20.GL_STATIC_DRAW);
        
                int vertexID = openGLRenderer.loadShader(
                        GLES20.GL_VERTEX_SHADER,
                        vertexShaderSrc);
        int fragmentID = openGLRenderer.loadShader(
                        GLES20.GL_FRAGMENT_SHADER,
                        fragmentShaderSrc);

                shaderProgram = GLES20.glCreateProgram();
                GLES20.glAttachShader(shaderProgram, vertexID);   // add the vertex shader to program
        GLES20.glAttachShader(shaderProgram, fragmentID); // add the fragment shader to program
                GLES20.glBindAttribLocation(shaderProgram, 0, "a_Position");
                GLES20.glBindAttribLocation(shaderProgram, 1, "a_Color");
        GLES20.glLinkProgram(shaderProgram);
            
                // Get the link status.
                final int[] linkStatus = new int[1];
                GLES20.glGetProgramiv(shaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0);

                // If the link failed, delete the program.
                if (linkStatus[0] == 0) 
                {               
                        GLES20.glDeleteProgram(shaderProgram);
                        shaderProgram = 0;
                }
                    
                mMVPMatrixHandle = GLES20.glGetUniformLocation(shaderProgram, "u_MVPMatrix");
                mPositionHandle = GLES20.glGetAttribLocation(shaderProgram, "a_Position");
                mColorHandle = GLES20.glGetAttribLocation(shaderProgram, "a_Color");
    
                positionSize = 3; colorSize = 4; floatBytes = 4;
                vertexSizeBytes = (positionSize + colorSize) * floatBytes;
            
                GLES20.glUseProgram(shaderProgram);
        }
    
        public void draw(float[] mvpMatrix) {
            
                //vertexBuffer.position(0);
                GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboID[0]);
                GLES20.glVertexAttribPointer(mPositionHandle,  positionSize, GLES20.GL_FLOAT, false,
                                                                         vertexSizeBytes, 0);
                GLES20.glEnableVertexAttribArray(mPositionHandle);
            
                //vertexBuffer.position(3);
                GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, vboID[1]);
                /*GLES20.glVertexAttribPointer(mColorHandle, colorSize, GLES20.GL_FLOAT, false,
                                                                         vertexSizeBytes, 3);*/
                GLES20.glEnableVertexAttribArray(mColorHandle);
                
                GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
            
                GLES20.glDrawElements(GLES20.GL_TRIANGLES, elementArray.length, GLES20.GL_UNSIGNED_SHORT, 0);
                GLES20.glDisableVertexAttribArray(mPositionHandle);
                GLES20.glDisableVertexAttribArray(mColorHandle);
                GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
                GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
        }
}

0 ответов

Другие вопросы по тегам