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 3

1 ответ:

На стороне GL я бы использовал drawElements, который нуждается в списке точек и списке индексов в качестве входных данных. Таким образом, возникает вопрос, как сгенерировать список индексов в свой список точек.

Имея в виду исходную сетку XZ, идея состоит в том, чтобы нарисовать два треугольника для каждой ячейки сетки. Таким образом, нам нужно 6 индексов на ячейку сетки. В Haskell мы можем написать что-то вроде:
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]]