Haskell OpenGL процедурная генерация
Я пытаюсь использовать Haskell для процедурной генерации триангулированного квадратного рельефа заданной ширины, который будет передан OpenGL.
Единственное, что на самом деле процедурно генерируется, - это высоты, что совсем не сложно, я просто использую случайную функцию для создания[[GLfloat]]
, представляющую ряды высот.
Тогда у меня также есть функция heightsToCoords
, которая берет [[GLfloat]]
и возвращает [GLfloat]
, содержащую координаты x, y и z каждой вершины.
Поэтому, если я позвоню heightsToCoords [[0, 1], [1, 0]]
, он будет возвращение
[0, 0, 0,
1, 1, 0,
0, 1, 1,
1, 0, 1]
Проблема, с которой я сталкиваюсь, - это передача данных в OpenGL. OpenGL нуждается в триангуляции каждой грани (по крайней мере, с моей настройкой), и все, что у меня есть, - это точки, я не знаю, как создать грани.
Как я могу преобразовать эти данные из списка точек в список граней? Не обращайте внимания на нормали и порядок вершин.
1 ответ:
На стороне GL я бы использовал
Имея в виду исходную сетку XZ, идея состоит в том, чтобы нарисовать два треугольника для каждой ячейки сетки. Таким образом, нам нужно 6 индексов на ячейку сетки. В Haskell мы можем написать что-то вроде:drawElements
, который нуждается в списке точек и списке индексов в качестве входных данных. Таким образом, возникает вопрос, как сгенерировать список индексов в свой список точек.concat [[x + width * (y+1), 1 + x + width*y, x + width * y, x + width* (y+1), 1 + x + width * (y+1), 1 + x + width*y] | y <- [0..height-1], x <- [0..width-1]]