В настоящее время я работаю над программой на C++, используя OpenXR с OpenGL. Мне удалось воплотить в VR все, что я хотел.
У меня есть один фреймбуфер на каждый глаз, а затем еще 3 для слоев (перекрестие/меню), которые отображаются при разных нажатиях кнопок (что делается в VR с помощью xrEndFrame).
Проблема в том, что я хочу отразить все на экране компьютера.
По большей части это было просто, потому что я просто использовал glBlitNamedFramebuffer для зеркального отображения одного из глазных фреймбуферов на фреймбуфер 0/default, чтобы он отображался.
Но я не могу использовать этот метод для слоев, так как он отображается на экране только в 2D, и мне нужно расположить слой, например, там, где я ищу в VR перекрестие.
Я могу нарисовать четырехугольник в желаемом положении, но не знаю, как скопировать содержимое фреймбуфера в четырехугольник. Я подумал, что glReadPixels может помочь, но это оказалось довольно неэффективно.
Извините, я имел в виду, что мне нужно поместить содержимое фреймбуфера в трехмерный мир. чтобы у меня был виден 2D-слой, но, например, он должен быть там, где я смотрю в виртуальной реальности, а не только в середине экрана.
Можете ли вы вместо этого сделать так, чтобы ваши «слоевые» кадровые буферы были подкреплены текстурой? Затем вы можете просто преобразовать это в четырехугольник.
У меня может быть текстура. У меня есть XrSwapchainImageOpenGLKHR, где «изображение — это дескриптор текстуры OpenGL, связанный с этим изображением цепочки обмена»
Вы можете проверить с помощью RenderDoc, существует ли этот дескриптор текстуры и содержит ли оно значимое значение.
Спасибо, мне удалось получить текстуру (сначала она выглядела неправильно) и отобразить ее на четырехугольниках. Это выглядит немного иначе, чем раньше, но я могу с этим работать.
Хорошая находка! Предложите опубликовать это как ответ самому себе, чтобы другие могли его найти.
Поэтому мне не удалось преобразовать один фреймбуфер в другой фреймбуфер, но, по крайней мере, для случая OpenXR есть решение.
Я создал слои как обычно, но вместо того, чтобы передавать их в OpenXr через xrEndFrame, я использовал цветовую текстуру из цепочки обмена.
colorTexture = reinterpret_cast<const XrSwapchainImageOpenGLKHR*>(hudLayer.m_swapchainImages[hudLayer.swapchain_][swapchainImageIndex])->image;
и визуализировал их в четырехугольниках в первом буфере кадров. (Я также мог бы использовать положение/ориентацию слоев для четырехугольников)
Я не понимаю утверждения «Но я не могу использовать этот метод для слоев, так как он только в 2D». Кадровые буферы тоже только 2D..