2

Так что я смотрел на another SO question regarding the command glVertexAttribPointer, и я натолкнулся на небольшое замешательство. Принятый ответ на этот вопрос объясняет,Могу ли я иметь несколько буферов GL_ARRAY_BUFFER?

Но есть дополнительная подразумеваемая часть состояния, которое также храниться для атрибута 0, когда вы делаете вызов: данные считываются из буфера в настоящее время связанно с GL_ARRAY_BUFFER

Это имеет смысл для меня, но что делать, если у меня есть несколько буферов, которые связаны как GL_ARRAY_BUFFER? Как метод glVertexAttribPointer() знает, какой из них установить атрибуты?

Например, в моем коде я рисую градиентный треугольник. Для этого я создал 2 VBOs, один с цветовыми данными в массиве, а другой с точками вершин.

glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    static const GLfloat points[] = { 
    //data here 
    }; 
    static const GLfloat colors[] = { 
     //data here 
    }; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
    vs = glCreateShader(GL_VERTEX_SHADER); 
    fs = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(vs, 1, &vertexShaderData, NULL); 
    glShaderSource(fs, 1, &fragShaderData, NULL); 
    glCompileShader(vs); 
    glCompileShader(fs); 
    sp=glCreateProgram(); 
    glBindFragDataLocation(sp, 0, "outColor"); 
    glAttachShader(sp, vs); 
    glAttachShader(sp, fs); 
    glLinkProgram(sp); 
    glUseProgram(sp); 
    glGenBuffers(1, &colorBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(1); 
    glDrawArrays(GL_TRIANGLES, 0, 9); 

Когда я вызываю команду, где указать, какой буфер использовать?

ответ

4

Это имеет смысл для меня, но что, если у меня есть несколько буферов, связанных как GL_ARRAY_BUFFER?

Это невозможно. Когда вы связываете буфер (или любой объект OpenGL) с целью, он автоматически отбрасывает все, что было до этого.

OpenGL object targets как глобальные переменные. Что произойдет, если вы установите глобальное целое число на 3? Старая ценность ушла.

glVertexAttribPointer будет всегда использовать любой буфер в настоящее время обязан GL_ARRAY_BUFFER. Поэтому при первом вызове он будет использовать buffer. При втором вызове он будет использовать colorBuffer.

Именно поэтому важно помнить, что glVertexAttribPointer действует на bound. Потому что даже после того, как вы связываете colorBuffer и устанавливаете его для использования атрибутом 1, атрибут 0 все еще получает свои данные вершин от buffer.

Так как вы не можете иметь несколько буферов, привязанных к GL_ARRAY_BUFFER, вы можете использовать несколько буферов в качестве источников для ваших данных вершин.

Смежные вопросы