Я хочу создать случайный фрактальный ландшафт на графическом процессоре (с помощью вычислительного шейдера). Я начал с реализации марширующих кубов: Создание сложных процедурных ландшафтов с помощью графического процессора , и это работает очень хорошо: маршрутные кубы на графическом процессоре. Однако марширующие кубы не могут извлекать четкие черты или использовать адаптивное разрешение.
Поэтому я искал продвинутый алгоритм извлечения изоповерхностей и нашел Dual Contouring of Hermite Data< /а>. Поэтому я реализовал dc на Java для тестирования этого алгоритма, и он выглядит великолепно: dc на процессоре. (В сетке есть некоторые дыры и нет острых элементов, но мне было лень реализовывать/исправлять это, потому что это всего лишь прототип.)
Но я заметил несколько негативных моментов:
Межклеточно-зависимый. (Я понятия не имею, как портировать это на GPU: единственный ресурс, который я нашел, это Двойное контурирование с OpenCL.)
Я не знаю, как создать систему чанков, потому что нет «четких» границ https://i.stack.imgur.com/62dy6.png.
Поэтому я продолжил поиск лучшего алгоритма и нашел Cubical Marching. Квадраты: адаптивная функция, сохраняющая извлечение поверхности из объемных данных. Это кажется мне идеальным алгоритмом: межклеточно-независимый, адаптивный, четкие черты, первичная структура и даже многообразие. К сожалению, нет ресурсов о том, как реализовать этот алгоритм, кроме этих Cubical Marching Squares. Реализация. Я думаю, что понимаю две части алгоритма: создайте сетку для каждой ячейки:
Разделяйте до тех пор, пока не будет достигнута максимальная глубина или пока в этом нет необходимости.
Разделите каждую ячейку на 6 граней, извлеките их поверхность и сшейте вместе.
Но я не знаю, как соединить эти две части (особенно часть с переходными гранями, стр. 38).
Итак, кто-нибудь знает, как реализовать DC в качестве шейдера, как реализовать cms или лучший алгоритм (может быть, двойные марширующие кубы, я думаю, что у него та же проблема, что и у DC, но я еще не тестировал его)?