如何在OpenGL ES 2.0中使用VAO

时间:2015-07-14 16:53:35

标签: android c++ opengl-es

我已经读过,建议使用VAO,但我不知道如何使用。 我正在使用tegra android开发包(使用OpenGL ES 2.0),我找不到方法glGenVertexArrays和glBindVertexArray。 ES 2.0是否支持VAO(没有扩展名)?

另外,我不明白VAO的好处是什么。目前我编译着色器并使用glBindAttribLocation。之后,我定义了三角形的顶点位置和颜色,并使用glVertexAttribPointer。然后我一次又一次地绘制三角形。

这是程序(没有错误检查):

static void createProgram() {
    // vertex shader
    const char* vertexShaderCode = getVertexShaderCode();
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderCode, NULL);
    glCompileShader(vertexShader);

    // fragment shader
    const char* fragmentShaderCode = getFragmentShaderCode();
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderCode, NULL);
    glCompileShader(fragmentShader);

    // create program
    program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);

    // Dem Programm sagen, unter welchem Index die Daten der Shader Attribute liegen
    glBindAttribLocation(program, 1, "in_pos");
    glBindAttribLocation(program, 2, "in_color");

    glLinkProgram(program);
}

这就是三角形:

static void loadGeometry() {
    GLuint buffers[2];
    glGenBuffers(2, buffers);
    GLuint vboPosition = buffers[0];
    GLuint vboColor = buffers[1];

    const int VERTEX_POSITION_BUFFER_SIZE = 12;
    const int VERTEX_POSITION_BUFFER_BYTESIZE = sizeof(GLfloat)* VERTEX_POSITION_BUFFER_SIZE;

    GLfloat vertexPositionBuffer[VERTEX_POSITION_BUFFER_SIZE] = {
        0.0f, 0.5f, 0.0f, 1.0f,
        -0.5f, -0.5f, 0.0f, 1.0f,
        0.5f, -0.5f, 0.0f, 1.0f };

    glBindBuffer(GL_ARRAY_BUFFER, vboPosition);
    glBufferData(GL_ARRAY_BUFFER, VERTEX_POSITION_BUFFER_BYTESIZE, vertexPositionBuffer, GL_STATIC_DRAW);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);

    // Repeat for color...
}

在抽奖电话中我只是做

glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 3);

0 个答案:

没有答案