Балуюсь с вокселями
Автор: nsf
Автор: nsf
К моему удивлению нашел применение геометрическим шейдерам - 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]
ogre или свой рендер?
NickGastovski
Свой.
Мост не угловатый, это классический 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/
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/ (кроме всего прочего я там отметился в комментах и можно найти дополнительный скриншот того, что я делаю).
uelkfr
Кстати спасибо за линк, очень интересно и наглядно.
Тема в архиве.