Aslan
> Мою демку смотрел?
Выглядит интересно, но детализация нединамическая как понял или?
registr
именно что динамическая, когда подлетаешь ближе видно, как делятся треугольники
Aslan
> diamond-square - не знаю, у меня из треугольников, начинается с икосаэдра
> меш 33*33 вершины - ты сделал для удобства вычисления след. уровня на GPU?
> Используешь шум Перлина?
Пока шум Перлина, fBm и разбиение Вороного для кратеров.
> > где много вычислений, надо использовать только GPU
> как сказать, 20K вершин - это много для CPU? А у тебя сколько?
200 мешей по 33*33 вершины = 200к вершин, fps зашкаливают за 300 (GeForce 9800 GTX+). 20к вершин было много во времена третьей кваки:)
> Точность float - 7 знаков (мантисса 24 бит). Хватило бы на планету (с учетом
> диапазона min dist - max dist), если бы z-buffer был линейным. Худшая ситуация
> когда к примеру стоишь на поверхности горы и горизонт за 100 км
А точность обычного 32-битного z-буффера - 9 знаков:) Линейность или лучше логарифмичность легко можно сделать в шейдере - преобразуй z координату как хочешь.
См. посты 643, 644, 645
http://www.gamedev.ru/code/forum/?id=122716&page=43#m643
Neptune
В статье Перлина наложение нескольких шумов разного "уровня", причем отдельный уровень задается прямоугольным массивом псевдослучайных значений в "узлах", и между ними интерполируется кубическим сплайном, расстояние между узлами уменьшается с каждым уровнем в 2 раза
Это несильно отличается от "взять среднее 4х точек, добавить случайное*шаг", только билинейная интерполяция вместо сплайна
А ты Perlin Noise так расчитываешь, следующий уровень из предыдущего?
Neptune
Замечательно!
Самое трудное подобрать таблицу : уровень->сила шума ?
В посте 44 цвета на поверхности Луны образуются из рельефа, или независимо?
А вот смотри, если допустим с некоторого расстояния область выглядит черной, а когда приближашься, вдруг возникают белые пятна? Есть зависимость от предыдущего уровня? В идеале уровень N должен получаться усреднением из уровня N+1, как в mipmap, возможно ли такое?
я вот тока по скринам не пойму ? степеней детализации нет чтоли ?
Вахтанг Кикабидзе
Судя по 644, есть
да я не про нептуна )), а про текущую тему )
Aslan
> именно что динамическая, когда подлетаешь ближе видно, как делятся треугольники
Теперь заметил, медленно просто. Ты просто их строишь или как-то индексируешь, чтобы можно было например с одного нового треугольника перепрыгнуть на другой?
Вахтанг Кикабидзе
> я вот тока по скринам не пойму ? степеней детализации нет чтоли ?
Две детализации, но они нединамические.
Aslan
> А ты Perlin Noise так расчитываешь, следующий уровень из предыдущего?
Нет, Я просто беру значение из шумовой текстуры, потом уменьшаю шаг в 2 или в другое (не обязательно целое) число раз, и обращаюсь к той же шумовой текстуре, и т.д. Ну и амплитуда на каждом шагу уменьшается.
fBm фрактал сторится похожим образом, результат несколько красивее, чем Перлин. Код функции в шейдере на Cg:
float Perlin(float3 point, float NOctaves, float lacunarity, float H) { float amplitude = 1.0; float value = 0.0; for (int i=0; i<NOctaves; i++) { value += Noise(point) * amplitude; point *= lacunarity; amplitude *= H; } return value; } float fBm(float3 point, float NOctaves, float lacunarity, float H) { float value = 0.0; for (int i=0; i<NOctaves; ++i) { value += Noise(point) * pow(lacunarity, -H*i); point *= lacunarity; } return value; }
Noise - функция шума с линейной интерполяцией. В простейшем случае - просто обращение к заранее созданной 3D текстуре, содержащей случайные числа [0...255].
inline float Noise (float3 point) { return tex3D(NoiseTexture, point).r * 2.0 - 1.0; }
Но я сделал самодельную интерполяцию, т.к. хардварная осуществляется с 8-битной точностью и приводит к сильным артефактам. Сама линейность интерполяции тоже приводит к артефактам - "клетчатости", что заметно например на последнем скрине поста 645. Возможный выход - сгладить текстуру шума.
Aslan
> Замечательно!
> Самое трудное подобрать таблицу : уровень->сила шума ?
Какой таблицы? На каждой октаве шум просто уменьшается в lacunarity или pow(lacunarity, -H) раз...
Aslan
> В посте 44 цвета на поверхности Луны образуются из рельефа, или независимо?
Все из рельефа, плюс небольшой цветовой шум. Но надо добавить всякие цветные разводы, лучи от некоторых кратеров, следы извержений вокруг вулканов, и т.д. Пока руки не дошли:)
Aslan
> А вот смотри, если допустим с некоторого расстояния область выглядит черной, а
> когда приближашься, вдруг возникают белые пятна? Есть зависимость от
> предыдущего уровня? В идеале уровень N должен получаться усреднением из уровня
> N+1, как в mipmap, возможно ли такое?
По-идее так и нужно делать, но это очень геморрно. Я забил:) Некоторый алиасинг наблюдается, но заметен он только в узких местах с резким переходом цвета, например на линии пляжа. По-идее, достаточно для нижних (глобальных) уровней выкидывать высокие октавы шума, тогда Перлин автоматически будет "сглаженным".
registr
Я недавно писал алгоритм разбиения икосаэдра на любой число сегментов. Вот тут http://zalil.ru/upload/29662955 есть краткое описание, раздел "Генерация численной модели в рамках геодезической сферы"
Если хочешь, могу скинуть исходники)
Назови движок Сфериум.
MaJa
Спасибо, результат будет в принципе аналогичен итерационному методу. Как показывает моя практика, проблема не в том, чтобы разбить, а в том, чтобы удобно индексировать вершины и треугольники. В моей демке вершины и треугольники индексированы последовательно по правилу правого винта, закручиваясь с севера на юг. Если выбрать вершину и нажимать клавиши "," и "." (на клавиатуре они совпадают с "<" и ">"), то можно это наглядно увидеть.
MaJa
> MaJa
Причем, если использовать метод итераций, то древовидная структура образуется автоматически. С другой стороны, накладываются ограничения на число треугольников сферы.
Тема в архиве.