В мозге придумался способ, как таки прикрутить к моей концепции рендера объёмный туман воды
(напоминаю: на целевой платформе - дремучая GLES2, чтение из глубины не поддерживается, рендербуфер максимум один, других форматов, кроме RGBA8, не завезли)
Я уже постулировал ранее, что любые полупрозрачности ограничены 10 метрами вокруг камеры, дальше - вода непрозрачная (и видимость в воде не дальше 10м).
Но я пытался построить концепцию по науке, т.е. накласть воду поверх отрисованной сцены. И не сходился у Данилы-мастера каменный цветок.
А надо было пойти с другого конца. Все чанки, попадающие в радиус 10 метров, рендерятся по любому особо (меши генерятся каждый кадр), с особыми трюками, как то:
- задняя стенка непрозрачности воды - сфера, врезанная в общий меш.
- гаранты непрозрачности земли - подкладки, вставляемые за ближайшими стенками на случай частичного провала камеры сквозь текстуры (обрезано ближней плоскостью, например)
- передняя поверхность воды - пузырь > ближней плоскости, врезаемый в объём воды
Но. Я могу отрендерить поверхности воды *сначала*, в отдельный буфер *пониженного* разрешения (и цвет тумана воды в ещё один буфер совсем убитого разрешения), а потом при рендере ближних чанков читать из этих текстур и блендить туман воды прямо в фрагментном шейдере.
Минус: фрагментный шейдер выходит ещё тяжелее. Как бы не сдох ослик.
Плюс: таки один проход. Один, Карл!
RGBA8 = 256 градаций на 10 метров, с дробностью 4 см. Если не делать болот с очень непрозрачной водой (беру пример Planet Explorers, где при вплывании из моря в болото просто меняются параметры шейдера цвет/прозрачность, и морская вода с болота выглядит болотной, а болотная вода с моря - морской) Так вот, если не разводить болот с непрозрачной водой - дробности хватит.
А если использовать все 4 компоненты (не пропадать же двум) и, например, сделать R - весь диапазон, G - первые 128 сантиметров, то можно ещё улучшить точность. Или забить и рендерить яркость в ту же текстуру (B - яркость) а цвет - униформой.
Чтобы не было артефактов - передняя поверхность воды непрозрачная когда камера в воде, а задняя - непрозрачная, когда камера - в воздухе. Т.е. водопад прозрачным сделать не получится.
Бред написал. Непрозрачная - любая поверхность воды, расположенная дальше дальней поверхности из буфера.
..а на ПК можно чуть улучшить, сделав этот буфер half float.
..для примера, какие расширения GLES2 доступны на малине:
GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_texture_npot GL_OES_depth24 GL_OES_vertex_half_float GL_OES_EGL_image GL_OES_EGL_image_external GL_EXT_discard_framebuffer GL_OES_rgb8_rgba8 GL_OES_depth32 GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_APPLE_rgb_422 GL_EXT_debug_marker
, где цветом отмечены полезные для меня.