Как создать одноканальную 32-битную сжатую текстуру с плавающей точкой в ​​OpenGL - PullRequest
0 голосов
/ 14 января 2019

Согласно документации, я могу создать сжатую текстуру HDR, поэтому я делаю это:

funcs->glGenTextures(1, &newCompressedTexture);
funcs->glActiveTexture(GL_TEXTURE0 + g_cTileTextureUnit);
funcs->glBindTexture(GL_TEXTURE_2D, newCompressedTexture);
funcs->glTexStorage2D(GL_TEXTURE_2D, 1, oglTileInfo.m_compressedInternalFormat, g_cTileWidthWithBorder, g_cTileWidthWithBorder);
funcs->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, g_cTileWidthWithBorder, g_cTileWidthWithBorder, GL_RED, GL_FLOAT, getUncompressedData().rData()._m_data.data());

Где oglTileInfo.m_compressedInternalFormat имеет значение GL_COMPRESSED_RED_RGTC1 или GL_COMPRESSED_RGBA_ASTC_4x4_KHR. Никаких ошибок gl нет, шейдер работает правильно, но значение, которое я получаю с помощью texture (), зафиксировано между [0,1] и его глубиной всего 8 бит. Все работает нормально, если я использую GL_R32F в качестве внутреннего формата текстуры, но мне нужно сжатие. Спасибо.

1 Ответ

0 голосов
/ 14 января 2019

Если ваша реализация OpenGL поддерживает текстуры ASTC, вы можете загрузить предварительно сжатые данные ASTC в текстуру. Однако , поддержка ASTC не требует реализации для сжатия данных текстуры для вас , поэтому выгрузка несжатых данных просто запрещена. Вы должны сжать ваши данные в другом месте перед загрузкой.

Кроме того, хорошее сжатие ASTC не особенно быстрое, поэтому, если вы генерируете эти данные с плавающей запятой в своем приложении, это будет проблематично.

Что касается GL_COMPRESSED_RED_RGTC1, это нормализованный формат. Таким образом, в то время как реализации требуют сжатия данных для вас, они все равно будут ограничивать эти данные до [0, 1].

BPTC требует реализации, чтобы иметь возможность сжимать такие текстуры в линию. Поэтому использование одного из его форматов с плавающей запятой, вероятно, будет функциональным. Однако такое сжатие не будет особенно быстрым и не будет особенно хорошим .

...