2014-01-12 3 views
3

하스켈을 사용하여 주어진 넓이의 삼각형 사각형 지형을 절차 상 생성하여 OpenGL에 제공하려고합니다.하스켈 OpenGL 절차 생성

실제로 절차 적으로 생성되는 유일한 것은 높이가 아니며 전혀 어렵지 않습니다. 단지 무작위 함수를 사용하여 높이 행을 나타내는 [[GLfloat]]을 만듭니다.

heightsToCoords이 함수는 [[GLfloat]]이고 각 정점의 x, y 및 z 좌표를 포함하는 [GLfloat]을 반환합니다. 내가 heightsToCoords [[0, 1], [1, 0]]를 호출하는 경우

그래서,

[0, 0, 0, 
1, 1, 0, 
0, 1, 1, 
1, 0, 1] 

내가 OpenGL을에 데이터를 점점 데 문제를 반환합니다. OpenGL은 각 얼굴을 삼각형으로 배치해야합니다 (최소한 내 설정이 필요함). 그리고 내가 가진 것만으로도 얼굴을 만드는 방법을 모르겠습니다.

포인트 목록에서이 데이터를 어떻게 얼굴 목록으로 변환 할 수 있습니까? 법선과 정점 순서는 무시하십시오.

+0

관련없는 제안 : 내가 [배열]을 사용하십시오 (https://hackage.haskell.org/package/array)보다는 높이에 대한 목록의 목록 그러면 각 행의 너비가 동일하게 유지됩니다. (그리고 아마도 더 효율적일 것입니다.) – icktoofay

+1

아마 [벡터] (https://hackage.haskell.org/package/vector)일지도 모르겠습니다. 아마 훨씬 더 효율적입니다. – icktoofay

+0

나는 haskell에서 2D로 절차 적으로 생성 된 그래픽을 작성한 것을 썼다. 그것은 디스플레이리스트와 haskell리스트를 사용했습니다. 코드는 [여기] (https://github.com/DiegoNolan/Generated)입니다. – DiegoNolan

답변

3

GL 쪽에서는 점 목록과 색인 목록을 입력으로 사용해야하는 drawElements을 사용합니다. 그래서 질문은 여러분의 포인트 목록에 인덱스 목록을 생성하는 방법이됩니다.

원래 XZ 그리드를 염두에 두면서 아이디어는 그리드의 각 셀에 대해 두 개의 삼각형을 그립니다. 그리드 셀당 6 개의 인덱스가 필요합니다. 하스켈에서 우리는 같은 것을 쓸 수 있습니다 :

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]]