Могу ли я иметь несколько буферов GL_ARRAY_BUFFER?

Итак, я смотрел на еще один вопрос, касающийся команды glVertexAttribPointer и я столкнулся с небольшим замешательством. Принятый ответ на этот вопрос объясняет,

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

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

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

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);

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

3

Решение

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

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

Целевые объекты OpenGL как глобальные переменные. Что происходит, когда вы устанавливаете глобальное целое число в 3? Это старая ценность ушла.

glVertexAttribPointer будут всегда использовать любой буфер В настоящее время связан с GL_ARRAY_BUFFER, Так что в вашем первом звонке, он будет использовать buffer, Во втором звонке он будет использовать colorBuffer,

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]