2014-09-03 3 views
4

Я работаю над некоторым программным обеспечением для создания HD-изображений, и хотя в настоящее время для этой версии не запланированы очень большие текстуры, я хотел бы сделать некоторые будущие проверки.Обработка текстур 4gb (BigTiff) OpenGL

Если я имел дело с очень большими текстурами (например, 1095630 x 939495), могу ли я использовать стандартную комбинацию сжатых текстур и сопоставления mip или эти текстуры будут иметь большое значение для хранения в памяти текстур?

Мое предположение: они были бы слишком большими, и мне нужно было бы сделать ручную mip-карту psudeo на CPU. I. Прихватите очень большие данные, создайте разумную сжатую версию для полного уменьшения, а затем, когда пользователь увеличит масштаб, отправьте подсекции большой текстуры на GPU?

Идея сделать указанное сжатие на процессоре будет ужасно медленной, поэтому мой план состоит в том, чтобы набивать данные и отправлять им куски для GPU для сжатия. В каком случае, как я могу узнать, желательно динамически, максимальный размер текстуры, который может обрабатывать графический процессор?

Я новичок в формате TIFF, но с его внешностью, уже сохраненной как плитка, это правильно? Я надеюсь немного поиграть с libtiff, но я не нашел много примеров его использования (мои навыки Google меня не оправдали сегодня, извинения). https://stackoverflow.com/questions/ask

Существующие примеры Я надеюсь получить некоторые указатели из этих двух:

В заключение:

  • Как я узнать максимальный размер текстуры графический процессор может обрабатывать (предпочтительно 3D размер текстуры ...)
  • Что лучший способ разбить большой формат текстур и сжать его до того, что графический процессор может обрабатывать
  • Каков наилучший способ облегчить масштабирование?
  • Указатели на использование libTiff?
+0

(((1095630 x 939495 x 4 (rgba))/1024 (килобайт))/1024 (мегабайт))/1024 (гигабайт)) ~ = 383,5 ГБ – CoffeeandCode

+0

Так что, думаю, это, вероятно, слишком велико для хранения в текстурной памяти ... наверное. – CoffeeandCode

ответ

3

Это зависит от используемого оборудования.

Если ваша цель - широко распространенная поддержка большого числа генераторов графических процессоров, то обновление на уровне текстуры (mipmap) на месте, как вы предлагаете, - это путь. Старые поколения GPU имеют ограничение на максимальное разрешение текстуры, которое может обрабатываться. Обычно примерно 4096-8192 в любом измерении. Обычно у вас будет набор текстур плитки (каждая плитка составляет 1024 × 1024 или около того), с достаточным количеством плиток, выделенных для покрытия всего экрана плюс некоторый запас.

Если ваша цель - графические процессоры более позднего поколения, то вы можете использовать что-то, называемое «Megatextures» Джона Кармака: использование бесконтактной, разреженной текстуры. Это не основная функциональность OpenGL, но она открыта расширениями GL_ARB_sparse_texture и GL_ARB_bindless_texture. Вместо того, чтобы иметь набор текстурных плит, у вас есть одна большая «виртуальная» текстура, в которую вы можете передавать нужные плитки по требованию.

На GPU, поддерживающих это, вы также не столкнетесь с ограничениями, установленными объемом выделенного ОЗУ GPU.В OpenGL никогда не было понятия «доступная видеопамять», и текстуры всегда можно было поменять местами по требованию. Благодаря поддержке разреженных текстур, сегодня графические процессоры могут выгружать гигабайты данных текстуры в системную память и извлекать их оттуда в их ОЗУ GPU при необходимости (по существу, системная память превращается в кеш L4 для данных текстуры).

1

OpenGL имеет ограничение на максимальный размер обычной текстуры. Этот предел зависит от конкретной реализации и может быть легко запрашиваются с glGetInteger():

GLint maxGPUTextureSize; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxGPUTextureSize); 

Согласно документации:

Значение дает грубую оценку крупнейшей текстуры, что GL может справиться. Значение должно быть не менее 1024.

Это максимальный размер квадрата в пикселях текстуры. I.e .: 1024x1024.

Теперь, как было предложено @datenwolf, ваша проблема кажется вполне подходящей для техники «Megatexture» «Виртуального текстурирования». Сделайте поиск этих терминов, и вы найдете много работы и документы по этому вопросу. Я думаю, что this GDC presentation от Шона Барре был одной из первых открытых работ на эту тему, очень достойный внимания. Кроме того, в книге GPU Pro 1 есть две статьи об этой технике.

+1

Оба ответа превосходны, я особенно ценю ваше упоминание о max_texture_size и отличных ресурсах, я дам @datenwolf лучший ответ только в первый раз, когда он будет почтовым основанием, желаю, чтобы я мог отметить оба как равные ... – chrispepper1989

Смежные вопросы