Невозможно получить данные буферного объекта через glGetBufferSubData
Я надеялся сделать башню ханойской игры, используя opengl. В конце концов я столкнулся с проблемой обработки и передачи данных из одного буферного объекта в другой. Я успешно сохранил свои вершины в буферном объекте и связал его с массивом вершин. А теперь хочу переместить это в другой созданный буферный объект, привязанный к другому массиву вершин. Проблема в том, что когда я пытаюсь получить свои вершины с помощью glGetBufferSubData, мой массив данных показывает, что все его элементы равны нулю (я распечатал его на консоли). Я дважды проверил, есть ли у моего буферного объекта правильные данные, и, похоже, так оно и есть. Пожалуйста, помогите мне, я здесь на конце моей веревки.
Мой код:
struct Stack
{
unsigned int top;
VA vao;
};
void transfer(Stack& s1, Stack& s2)
{
float data[20];//collects data
s1.vao.Bind();
glGetBufferSubData(GL_ARRAY_BUFFER, 0, 20* sizeof(float), data);`
for (int i = 0; i < 20; i+=5)//prints data collected
{
cout << i+1 << "th loop" << endl;
for (int j = i; j < i + 5; j++)
{
cout << data[j]<<"\t";
}
cout << endl;
}
s2.vao.Bind();
glBufferSubData(GL_ARRAY_BUFFER, 0, 20 * sizeof(float), data);
}
2 ответа
Для использования glGetBufferSubData
а также glBufferSubData
, поэтому вам нужно привязать объект буфера, а не объект массива вершин. Эта операция читает из объекта буфера, который в настоящее время привязан к указанной цели.
В GL_ARRAY_BUFFER
это глобальное состояние. В векторе состояния VAO хранятся ссылки на VBO, но привязка VAO не связывает какой-либо VBO. Если бы целевой буфер былGL_ELEMENT_ARRAY_BUFFER
, то вам придется привязать VAO, потому что привязка индексного буфера хранится в VAO.
В любом случае, если вы хотите скопировать данные из одного буфера в другой, вы можете использовать glCopyBufferSubData
/glCopyNamedBufferSubData
, который копирует хранилище данных буферного объекта напрямую в хранилище данных другого буферного объекта, без загрузки данных из GPU в CPU.
GL_ARRAY_BUFFER
не является частью состояния VAO. Поэтому привязка VAO не меняетGL_ARRAY_BUFFER
привязка.
Вы должны сохранить идентификатор буфера, чтобы связать его перед чтением данных. Если по какой-то причине у вас нет исходного идентификатора буфера, вы можете получить его с помощью
glGetVertexAttribiv(attrib, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &id)
Обратите внимание на то, что каждый атрибут VAO может иметь свой буфер.