glTexSubImage2D с GL_PIXEL_UNPACK_BUFFER дает GL_INVALID_OPERATION

В настоящее время я пытаюсь использовать PBO для передачи видеоданных в текстуры. Я не уверен, возможно ли то, что я пытаюсь сделать, или хороший способ сделать это, если это возможно... У меня есть 3 текстуры в формате GL_RED (по одной на каждый канал, в настоящее время не используется Alpha) . Все три из них будут заполнены за один вызов внешней библиотеки.

Вот привязка буфера и т.д.:

void LockTexture(const TextureID& id, void ** ppbData)
{
    Texture& tex = textures.getArray()[id];
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tex.glBufID);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, tex.width * tex.height, NULL, GL_STREAM_DRAW);
    *ppbData = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
}

Это делается для трех текстур, затем буферы заполняются внешней библиотекой. Затем я пытаюсь подтолкнуть их к текстуре, например так:

void UnlockTexture(const TextureID& id)
{
    Texture& tex = textures.getArray()[id];
    glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
    glBindTexture(tex.glTarget, tex.glTexID);

    glCheckForErrors(); // <--- NO ERROR

    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex.width, tex.height, GL_RED, GL_UNSIGNED_BYTE, 0);

    glCheckForErrors(); // <--- ERROR

    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
    glBindTexture(tex.glTarget, 0);
}

Просматривая список причин, по которым может возникнуть ошибка, вот что я знаю:

  • массив текстур был определен
  • тип правильный
  • параметр данных (смещение) хорош в 0
  • не выполняется между glBegin/glEnd

В этом я не уверен:

  • ошибка генерируется, если ненулевое имя объекта буфера привязано к цели GL_PIXEL_UNPACK_BUFFER, и данные будут распакованы из объекта буфера, так что требуемое чтение памяти превысит размер хранилища данных.

Кажется, что это может быть проблемой, но я понятия не имею, как еще с этим справиться:

  • ошибка генерируется, если ненулевое имя объекта буфера привязано к цели GL_PIXEL_UNPACK_BUFFER, а хранилище данных объекта буфера в настоящее время сопоставлено.

Правильно ли я говорю, что этот glUnmapBuffer отменяет отображение последнего отображаемого буфера, поэтому правильный буфер все еще отображается?

ГЛ версия 3.2

Я был бы очень признателен за любую помощь в этом, спасибо!


person Ramon Johannessen    schedule 01.03.2014    source источник


Ответы (1)


glUnmapBuffer(target) отключит отображение буфера, который в данный момент привязан к target. Из кода, который вы разместили, неясно, будет ли по-прежнему та же привязка, что и во время вызова карты. Ваши формулировки предполагают, что вы делаете сопоставление для всех 3 сразу после друг друга, и когда вы пытаетесь отменить его, вы только удаляете последний сопоставленный, потому что вы забываете повторно связать другие, что приведет к этой ошибке для первых двух ваших текстур.

person derhass    schedule 01.03.2014
comment
Да, я думаю, именно это и происходит. В свете того факта, что мне нужно, чтобы все 3 одновременно передавались во внешнюю библиотеку, какой подход вы бы порекомендовали для решения этой проблемы? - person Ramon Johannessen; 01.03.2014
comment
@RamonJohannessen: нет ничего плохого в одновременном отображении нескольких буферов. Просто добавьте вызов glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tex.glBufID); в вашу функцию UnlockTexture перед тем, как вы на самом деле попытаетесь ее отменить, и она будет работать, как и ожидалось. - person derhass; 01.03.2014
comment
Да, по какой-то причине я исключал этот вариант... теперь это кажется очевидным... это научит меня делать это в полусне. Спасибо! - person Ramon Johannessen; 01.03.2014
comment
Так что, кажется, есть что-то еще, производящее ту же ошибку. Я добавил вызов привязки перед удалением карты, но тот же результат. Теперь я действительно не уверен, что мне не хватает... - person Ramon Johannessen; 02.03.2014
comment
Не бери в голову! Был некоторый код отладки, который я не изменил обратно. Сейчас работает :D - person Ramon Johannessen; 02.03.2014