Невозможно получить данные объекта буфера через glGetBufferSubData - PullRequest
2 голосов
/ 12 апреля 2020

Я надеялся сделать игру «Ханойская башня» с использованием 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 ]

2 голосов
/ 12 апреля 2020

Для использования glGetBufferSubData и glBufferSubData, таким образом, вам необходимо связать объект буфера вместо Vertex Array Object . Эта операция выполняет чтение из объекта в буфере, который в данный момент связан с указанной целью.

GL_ARRAY_BUFFER - это глобальное состояние. В векторе состояния VAO хранятся ссылки на VBO, но привязка VAO не связывает VBO. Если целью буфера будет GL_ELEMENT_ARRAY_BUFFER, то вам придется связать VAO, поскольку привязка Index Buffer хранится в VAO.

В любом случае, если вы хотите скопировать данные из одного буфера в другой, вы можете использовать glCopyBufferSubData / glCopyNamedBufferSubData, который копирует хранилище данных объекта буфера в данные сохранять другой буферный объект напрямую, не загружая данные из графического процессора в центральный процессор.

1 голос
/ 12 апреля 2020

GL_ARRAY_BUFFER не является частью состояния VAO. Следовательно, привязка VAO не меняет привязку GL_ARRAY_BUFFER.

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

glGetVertexAttribiv(attrib, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &id)

Обратите внимание, что каждый атрибут VAO может иметь свой буфер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...