Как я могу нарисовать много ГБ образ OpenGL, когда недостаточно памяти GPU?
Первая идея: кусками.
Если вы собираетесь рисовать фиксированное изображение, без смены камеры, без изменения масштабирования, то этот метод может быть следующим: заполнить текстуру каждым фрагментом, нарисовать ее, повторить с другим фрагментом. Графический процессор будет отбрасывать части вне поля или перекрывать разные части изображения в одном пикселе. Для нефиксированного вида это непрактично, ужасно медленно.
Но, подождите, все ГБ действительно?
Для монитора 4K 3840x2160 = 8,3 МПикселя требуется 8,3 x 4 = 33,2 МБ данных RGBA.
Вопрос в том, как выбрать 33,2 МБ среди стольких ГБ необработанных данных.
Допустим, у вас есть массив плиток (каждая плитка представляет собой кусок большого изображения).
Первое улучшение - это не отправка в графический процессор плиток, которые выпадают из поля зрения. Это можно проверить, используя на стороне процессора типичную матрицу MVP с четырьмя углами элемента мозаичного изображения.
Второе улучшение заключается в том, что плитка находится слишком далеко от камеры, но внутри точки обзора перспективы / ортогональной проекции. Это будет рассматриваться как один пиксель. Зачем отправлять в графический процессор всю плитку, когда достаточно точки для этого пикселя?
Оба улучшения могут быть достигнуты с quadtree лучше, чем массив.
В нем хранятся указатели или идентификаторы на плитках. Но также для промежуточных узлов a репрезентативных точек со средним цветом его подузлов. Или репрезентативная плитка, которая «сжимает» несколько плиток.
Пройдите по дереву. Откажитесь от узлов (и, следовательно, их ветвей) из fustrum. Визуализируйте репрезентативные точки / плитки вместо текстур, когда плитка слишком далеко. Рендеринг всей плитки, когда какой-то край больше 1 пикселя.
Вы не будете отправлять только 33,2 МБ, но что-то меньше 100 МБ, с чем довольно легко справиться.