Я использую Pixel Pixel Buffer Objects (PBO) с постоянными сопоставленными буферами для асинхронного обновления текстур в моем приложении QT. В моей петле рендеринга я делаю что -то вроде этого: < /p>
void GLWidget::updateTextures() {
for (int i = 0; i < workers.getVideoCount(); ++i) {
std::shared_ptr frame = workers.getNextFrame(i);
if (!frame) continue;
int nextIndex = (pboIndex[i] + 1) % MAX_PBO;
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[i][nextIndex]);
void* ptr = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
if (ptr) {
memcpy(ptr, frame->bits(), frame->width() * frame->height() * 3); // This blocks and eats render time
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
}
glBindTexture(GL_TEXTURE_2D, textureId[i]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, frame->width(), frame->height(), GL_RGB, GL_UNSIGNED_BYTE, 0);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
pboIndex[i] = nextIndex;
}
}
Как я могу сделать загрузку данных текстуры (особенно в Memcpy в PBO) асинхронную или разгруженную в другой поток, не задерживая основной цикл рендеринга?
Я использую Pixel Pixel Buffer Objects (PBO) с постоянными сопоставленными буферами для асинхронного обновления текстур в моем приложении QT. В моей петле рендеринга я делаю что -то вроде этого: < /p> [code]void GLWidget::updateTextures() { for (int i = 0; i < workers.getVideoCount(); ++i) { std::shared_ptr frame = workers.getNextFrame(i); if (!frame) continue;
int nextIndex = (pboIndex[i] + 1) % MAX_PBO;
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[i][nextIndex]); void* ptr = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); if (ptr) { memcpy(ptr, frame->bits(), frame->width() * frame->height() * 3); // This blocks and eats render time glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); }
pboIndex[i] = nextIndex; } } [/code] Как я могу сделать загрузку данных текстуры (особенно в Memcpy в PBO) асинхронную или разгруженную в другой поток, не задерживая основной цикл рендеринга?
Я долго и упорно пытался решить эту проблему. Итак... Ребята, я обращаюсь ко всем вам! Проблема в том, что в каждом кадре я пытаюсь привязать свою текстуру:
Texture.hpp
class Texture : public Component
{
public:
Я попытался реализовать обратное чтение нарисованного фреймбуфера для автоэкспозиции, но, что бы я ни пытался, либо glGetTexImage, либо glMapBuffer зависает.
Я делаю это неправильно, или это проблема моей конкретной машины , потому что я не могу...
Я экспериментировал с созданием средства рендеринга 2D-плиток. Проблема в том, что возникнут проблемы с производительностью, поскольку переключение VAO с привязкой к сети довольно сильно влияет на производительность. Проблема, с которой я сейчас...
Прорисовка деревьев в OpenGL во времени и пространстве требует больших затрат. В настоящее время я экспериментирую с созданием и рисованием сетки из нескольких десятков деревьев одновременно, которая регулярно обновляется по мере движения персонажа,...