【发布时间】:2013-11-12 04:20:20
【问题描述】:
我目前正在使用 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)
问题(我相信)是我手动将我的三维点中的每一个转换为二维,然后使用 OpenGL 绘制这些点。
我的问题是:我是否应该给 OpenGL 提供三维点,然后使用 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
【问题讨论】:
-
opengl 是一个光栅器,它会为你完成所有的投影。查看GLFW-b-demo 以获得相当简洁的演示
-
“我的问题是:我应该提供 OpenGL 三维点,然后使用 OpenGL 已经烘焙的任何投影吗?”很有可能,但由于缺乏细节,我很难说。你想要完成什么,你目前是如何做到的?您提供了一些粗略的伪代码,但告诉我们更多有关您正在使用的确切 API 调用的信息会有所帮助。也不清楚您要渲染什么。
-
@JasonDagit 我在我的代码示例中进行了编辑 - 希望这更有意义。我的目标是在三维空间中绘制一堆顶点(
points)。然后,我想监听按键并在该空间内移动Camera对象。点应根据相机的位置和角度进行渲染。 -
只是为了确定:您是否推出了自己的(基于 CPU 的)投影算法?
-
是的,这可能非常慢。
标签: opengl haskell graphics 3d projection