Карта высот (текстура в видеопамяти) имеет дупликат в основной памяти. Когда некоторый участок карты изменяется, текстура ландшафта в видеопамяти обновляется (перезагружается заново). Так происходит синхронизация карт. Чтобы не тягать по шине данных всю карту, можно перезагружать лишь изменённый кусок карты (где кратер возник) - квадратик можно обновить функцией glTexSubImage2D(...).
А можно поступить ещё рациональнее! Можно все вычисления делать на GPU вообще! Например, привязав карту ландшафта как один из выводных буфферов. Любой эффект (кратер, трещина) может быть представлен текстуркой, которая рисуется на карте рельефа посредством смешивания. Тут нужно профильтровать вопрос насчёт обрезания выводных данных шейдера - я слышал, что текстуры float-формата не приводятся насильно к диапазону [0...1], и я это продемонстрировал выше в картинках - там высоты гор от 0 до 20+, и плоских вершин не заметно, не так ли?
Осталось проверить рендер в текстуры float-формата. Надеюсь, обрезки опять же не будет. Тогда можно делать терраформинг на 100% на GPU, а также избавиться от этих артефактов с отражениями.
Добавлено спустя 57 секунд:
Ах, да... Всё это будет стоить юзерам OpenGL 3+.
Добавлено спустя 9 минут 39 секунд:
Насчёт текстуры во floating point формате, которым я воспользовался в примерах выше. Карта грузилась так:
GLuint TexName;
glGenTextures(1, &TexName);
glBindTexture(GL_TEXTURE_2D, TexName);
glTexParameteri(targetType, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(targetType, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, 1024, 1024, 0, GL_RED, GL_FLOAT, HeightsMap);
Добавлено спустя 1 час 9 минут 54 секунды:
Шаман писал(а):
Осталось проверить рендер в текстуры float-формата. Надеюсь, обрезки опять же не будет. Тогда можно делать терраформинг на 100% на GPU, а также избавиться от этих артефактов с отражениями.
Проверил - работает. Судя по литературе, не совсем все видюхи (OpenGL3.0) умеют рендерить во float - текстуры - некоторые ограничиваются HALF_FLOAT форматом, но так или иначе обрезки и приведения к диапазону [0...1] для floatовых текстур не делается в принципе.
Однако это всё не дёшево даётся - внутренний трафик видеопамяти огромен: каждый пиксель текстуры формата GL_RGBA32F занимет 128 бит памяти. И если на видюхе написано GDDR3 64 бита (как на моей), это значит, что чтение/запись каждого пиксела текстуры идёт за два цикла (а тактовая частота памяти намного меньше частоты чипа, которая помпезно рекламируется). Так что все эти развлечения так же дороги, как и попиксельные нормализации нормалей.