Пакет GLSL плавает в текстуру RGBA

8

Я хочу составить обычные модели на основе треугольников и частицы с трассировкой лучей с разумной частотой кадров.

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

Я хотел бы ошибаться в этом, и это собрано из проб и ошибок, а не из какого-либо определенного источника; пожалуйста, исправьте любые ошибочные предположения

Как вы можете эффективно упаковать / распаковать float и, в идеале, некоторые биты флага и тому подобное, в RGBA-текстуру в фрагментном шейдере GLSL?

Будет
источник
2
В первой книге GPU Gems есть старая статья о теневом отображении (вы можете прочитать ее здесь: http.developer.nvidia.com/GPUGems/gpugems_ch12.html ). Он объясняет, как упаковать поплавки в RGBA-текстуру двумя различными способами. Посмотрите на раздел 12.3.3 для записи, затем 12.3.6 для чтения.
Benlitz
1
Еще один полезный ресурс - это статья «Компактное обычное хранилище для небольших G-буферов» Араса П из Unity ( aras-p.info/texts/CompactNormalStorage.html ). Эта статья ограничена только нормальными.
Мортеннобель
1
Вы можете создать текстуру R32F и просто записать туда свои значения глубины. без какой-либо упаковки распаковка. затем во время вашего второго прохода «на основе обычного треугольника» используйте эту текстуру в качестве буфера глубины (присоединяемого как глубина к FBO). Не стесняйтесь спрашивать больше, если это не ясно.
alariq
@alariq да, расширение float сейчас широко поддерживается.
Будет
@Will Если расширение float решило вашу проблему, то опубликуйте его как ответ и примите.
Полярный

Ответы:

5

Здесь представлены функции упаковки и распаковки, которые будут работать в WebGL и OpenGL ES 2.0, это только для значений в диапазоне 0 ... 1, поэтому вам следует позаботиться о том, чтобы расчет глубины находился в правильном пространстве.

Кодирование плавает в RGBA

gbpaul
источник
Можете ли вы добавить фрагменты кода в свой ответ? Если сайт, который вы упомянули, выйдет из строя, ссылка не будет работать.
Фелипе Гутьеррес