无法在没有VAO的情况下在OpenGL中绘制矩形

时间:2017-02-17 04:25:26

标签: opengl-es vbo vao

我成功地用VAO绘制了一个矩形。现在我尝试在没有VAO的情况下这样做,因为我想在OpenGL ES 2.0中使用它,而VAO仅支持OpenGL ES 3.0。但是,我无法使它发挥作用,我做错了什么?非常感谢您的关注和帮助。

我的顶点着色器:

attribute vec3 position;
attribute vec3 color;
attribute vec2 texCoord;


varying vec3 ourColor;
varying vec2 TexCoord;


void main()
{
    gl_Position = vec4(position,1.0f); // Add the xOffset to the x position of the vertex position
    ourColor = color;
    TexCoord= vec2(texCoord.x,1.0f-texCoord.y);
}

我的片段着色器:

varying vec3 ourColor;
varying vec2 TexCoord;



uniform sampler2D ourTexture1;
uniform sampler2D ourTexture2;
uniform float mixValue;

void main()
{
gl_FragColor = texture2D(ourTexture1 , TexCoord);
}

我的顶点属性和索引:

GLfloat recVertices[] = {
        // Positions          // Colors          // Texture Coords
        0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // Top Right
        0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // Bottom Right
       -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // Bottom Left
       -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f    // Top Left 
    };

    GLuint indices[] = {  // Note that we start from 0!
        0, 1, 3, // First Triangle
        1, 2, 3  // Second Triangle
    };

我的VAO代码工作正常:

GLuint VBOs[2], VAO ;
glGenBuffers(2, VBOs);

glGenVertexArrays(1, &VAO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);//0. Copy verticles array for OpenGL to use
glBufferData(GL_ARRAY_BUFFER, sizeof(recVertices), recVertices, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

// 1. set the vertex attributes pointers
// Position Attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
// Color Attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
//Texture Coordinate Attribute
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);
//Unbind VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);


glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

没有VAO的我的代码,使用VBO只是不起作用。它没有任何吸引力:

    /*-----------------------------------------------------------------------------------------------------------*/
    GLuint VBOs[2], ; // Initialize an buffer to store all the verticles and transfer them to the GPU
glGenBuffers(2, VBOs);


    glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);//0. Copy verticles array for OpenGL to use
    glBufferData(GL_ARRAY_BUFFER, sizeof(recVertices), recVertices, GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO[1] );
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);


    // 1. set the vertex attributes pointers
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    // Position Attribute
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);

    // Color Attribute
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));

    //Texture Coordinate Attribute
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));


    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

0 个答案:

没有答案