Как создать одноканальную 32-битную сжатую текстуру с плавающей запятой в OpenGL

Согласно документации я могу создать сжатую текстуру 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 в качестве внутреннего формата текстуры, но мне нужно сжатие. Спасибо.


person Павел Бодак    schedule 14.01.2019    source источник
comment
Не думаю, что есть такой формат.   -  person Andrea    schedule 14.01.2019
comment
@Andrea ASTC также может сжимать данные с плавающей запятой за пределами диапазона [0, 1]. Они представляют собой сжатие HDR (расширенный динамический диапазон). Цитата отсюда khronos.org/opengl/wiki/ASTC_Texture_Compression   -  person Павел Бодак    schedule 14.01.2019


Ответы (1)


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

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

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

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

person Nicol Bolas    schedule 14.01.2019
comment
Спасибо за ответ. Я не беспокоюсь о производительности сжатия. Мне интересно, может ли OpenGL сжимать данные с плавающей запятой по крайней мере в одном из форматов сжатия. При условии их поддержки, конечно. - person Павел Бодак; 14.01.2019