nsf gamedevЖурнал

Балуюсь с вокселями

Автор:

Изображение

К моему удивлению нашел применение геометрическим шейдерам - per-vertex материал! В вершинный буфер грузим индекс материала. В геометрическом шейдере для каждой вершины создаем два новых вектора из 3 элементов, в первом индексы, во втором вес материала:
vec3(mat[0], mat[1], mat[2]); vec3(1, 0, 0)
vec3(mat[0], mat[1], mat[2]); vec3(0, 1, 0)
vec3(mat[0], mat[1], mat[2]); vec3(0, 0, 1)

Соответственно так побеждается интерполяция и в фрагментном шейдере имеем индекс материала и его вес для каждой вершины в соответствующих каналах этих новых двух векторов. Естественно текстуры храним в Texture Arrays. Не уверен на счет производительности по сравнению с другими методами, но работает. :)

Может кто знает что на эту тему? Хочется per-vertex материал, при этом чтобы геометрия осталась из индексированных вершин.

P.S. Если интересно про то, как делал ландшафт, в комментах отпишитесь, может напишу и про это.

19 октября 2013

Комментарии [5]

#1
3:42, 20 окт 2013

ogre или свой рендер?

#2
3:59, 20 окт 2013

NickGastovski
Свой.

#3
15:26, 4 ноя 2013

Мост не угловатый, это классический marching cubes/marching tetrahedra?
Тени тоже отсутствуют, только phong shading, если это SDF (signed distance fields), то вроде тени легко генерируются и можно даже легко реализовать Percentage close shadows.

P.S. Если интересно про то, как делал ландшафт, в комментах отпишитесь, может напишу и про это.

По этому скриншоту сложно судить. Если есть overhang'и, т.е. не heightmap, то польза есть. Если нету, то нужно применить вот эти идеи http://accidentalnoise.sourceforge.net/minecraftworlds.html, только разумеется не бинарные значения (черно-белое) как в статье, а float value (градиенты).

Как насчет изменить структуру от индексов материалов к нескольким воксельным слоям? Т.е. чтобы была не только поверхность, но и содержимое.
http://upvoid.com/devblog/2013/07/terrain-engine-part-2-volume-ge… the-csg-tree/

#4
15:55, 4 ноя 2013

uelkfr
Я использую метод Naive Surface Nets как описано тут: http://0fps.wordpress.com/2012/07/12/smooth-voxel-terrain-part-2/

Мост не угловатый, на самом деле тот подход к генерации геометрии который использую я, не позволяет мне делать идеально угловатые поверхности, однако у меня для решения этой проблемы есть идея, но она пока что в состоянии ожидания (я уже проверил, она работает, но о ней позже).

Теней нету, на данный момент на террейн просто падает направленный источник света, считается диффузная часть и все. Достаточно чтобы проверить качество нормалей на данном этапе. Планирую в будущем писать light-pre-pass рендер, тени оставлю на самый потом. Есть еще идея считать освещенность солнцем банально пуская лучи с неба строго вниз, дешево, легко параллелизуемо, даст нужный эффект в пещерах. Но пока только идея, не пробовал.

На скриншоте видно мост, мост и есть overhang. Генерировать я тоже их могу 3д perlin noise'ом, просто я пока не трачу время на баловство с функциями генерации террейна. На данный момент занят системой LOD'ов и многопоточным генератором геометрии для системы чанков.

Не совсем понял разницу между "воксельными слоями" и индексами материалов, потому что по ссылке челы тоже используют индексы материалов. Естественно они не единственный параметр задающий плотность. У меня используется похожий подход что описан в статье по ссылке, только исключая нормали. Нормали нужны для воссоздания острых углов, как я писал выше у меня свои идеи насчет острых углов. Советую почитать: http://upvoid.com/devblog/2013/08/density-function-design/ (кроме всего прочего я там отметился в комментах и можно найти дополнительный скриншот того, что я делаю).

#5
14:21, 5 ноя 2013

uelkfr
Кстати спасибо за линк, очень интересно и наглядно.

nsf gamedevЖурнал

Тема в архиве.