私は現在、Haskell の OpenGL バインディングを使用して基本的なレンダリング デモを作成しています。問題は、2000 以上の頂点をほとんど処理できないことです。私の疑似コードは次のようになります。
terrain = The set of points generated from [-1...1] x [-1...1] x [-1...1].
camera = Camera at position (xc, yc) with angles (ax, ay, az).
while running:
input = anything that moves the camera's position or angles
projected = []
for point in terrain:
projected.append(camera.perspectiveProjection(point))
renderPoints(projected)
問題 (私は信じています) は、3 次元の各点を手動で 2 次元に変換し、OpenGL を使用してそれらの点をプロットしていることです。
私の質問は、OpenGL の 3 次元ポイントをフィードしてから、OpenGL が焼き付けたプロジェクションを使用する必要があるかどうかです。
(透視図法がどのように機能するかを理解しているように感じます。これを手動で行う必要があるかどうかはわかりません。)
編集:
以下は、ほとんどの場合、私のコードです。関数の定義だけを考えると、自明だと思われるセクションは省略しています。
main :: IO()
main = do
(_progName, _args) <- getArgsAndInitialize
initialDisplayMode $= [DoubleBuffered]
_window <- createWindow "Hello, World"
-- The camera position followed by pitch, yaw and roll.
camera <- newIORef Camera [0,0,0] 0 0 0
displayCallback $= display camera
mainLoop
display :: IORef Camera -> DisplayCallback
display camIO = do
camera <- get camIO
clear [ColorBuffer, DepthBuffer]
clear [ColorBuffer]
renderPrimitive Points $ mapM_ vertex
$ map perspectiveProjection camera points
swapBuffers
postRedisplay Nothing