“未知的GLU入口gluOrtho2D”在Haskell中使用opengl

时间:2011-10-18 10:07:17

标签: opengl haskell

我在使用ghc版本7.0.3.20110330的Ubuntu 11.10上运行nvidia显示驱动程序的“当前版本更新”。您可以通过运行来重现:

curl http://ix.io/1t6 > Stroke.hs; ghc --make Stroke.hs; ./Stroke
...
Stroke: user error (unknown GLU entry gluOrtho2D)

但我可以运行opengl并且运行正常。我尝试了glxgears,它运行良好,我运行了一个opengl基准测试,它也运行良好。

haskell opengl libs的版本 跑步的结果:

for p in OpenGL OpenGLRaw GLURaw; do ghc-pkg latest $p; done

OpenGL-2.4.0.1
OpenGLRaw-1.1.0.1
GLURaw-1.1.0.0

4 个答案:

答案 0 :(得分:2)

这是一个明确的错误。链接器存在问题(我不确定这是否特定于11.10或GHC 7.0+)。以下是对我的解释:链接器基本上决定,因为你没有静态链接到libglut,它只是通过不将你的可执行文件链接到它来优化。您可以通过将以下补丁应用于GLURaw 1.1.0.0来解决此问题:

diff -ur GLURaw-1.1.0.0.orig/cbits/HsGLURaw.c GLURaw-1.1.0.0/cbits/HsGLURaw.c
--- GLURaw-1.1.0.0.orig/cbits/HsGLURaw.c    2011-05-12 09:02:30.000000000 +1200
+++ GLURaw-1.1.0.0/cbits/HsGLURaw.c 2011-05-11 23:08:10.000000000 +1200
@@ -68,6 +68,9 @@

 #include <stdlib.h>
 #include <dlfcn.h>
+#include <stdio.h>
+#include <GL/glu.h>
+

 void*
 hs_GLU_getProcAddress(const char *name)
@@ -80,6 +83,7 @@
     /* Get a handle for our executable. */
     handle = dlopen(NULL, RTLD_LAZY);
   }
+  printf("%p\n", gluBeginCurve);

   return handle ? dlsym(handle, name) : NULL;
 }
Only in GLURaw-1.1.0.0: dist

应用此补丁后在GLURaw上运行cabal install,它应该摆脱这个问题。

答案 1 :(得分:1)

我知道将编译步骤改为:

ghc --make Stroke.hs -lGL -lGLU -lglut

我有版本(我没有安装OpenGLRaw,GLURaw):

cabal list *

* OpenGL
    Default available version: 2.4.0.1
    Installed versions: 2.2.3.0
* OpenGLRaw
    Default available version: 1.1.0.1
    Installed versions: [ Not installed ]
* GLURaw
    Default available version: 1.1.0.0
   Installed versions: [ Not installed ]

编辑:我正在使用 Ubuntu 11.04 GHC 7.0.3 Haskell Platform 2011.2.0.1

答案 2 :(得分:0)

我在我的系统上编译了它(Mac OS 10.7.2和GHC 7.2.1),它在这里工作,所以程序应该是正确的。我的包版本是

GLURaw-1.1.0.0
GLUT-2.2.2.0
OpenGL-2.4.0.1
OpenGLRaw-1.1.0.1

也许您可以尝试找一个使用gluOrtho2D的简单C / C ++示例,看看是否有效?

答案 3 :(得分:0)

从OpenGL 3.0开始,GLU的使用似乎已被大量弃用,自从Haskell的OpenGL-2.4软件包以来,已经使用了更多的版本。 OpenGL wiki上有一个提到:

  

GLU - OpenGL实用程序库是一个额外的库   包含一些用于其他任务的函数。它是   传统的,可以在很多教程和例子中找到。但   GLU使用了许多现已弃用的OpenGL功能。该   内部投影矩阵不应再使用,所以   程序员应该使用gluPerspective的替代品来代替   更新内部投影矩阵将返回此矩阵。

这表明不再使用Graphics.Rendering.OpenGL.GLU.Matrix中的函数。这包括:

ortho2D
perspective
lookAt
pickMatrix
project
unProject
unProject4 

我怀疑这可能是您的代码编译的原因,但在使用ortho2D时失败。

使用glOrtho代替gluOrtho2D可能很诱人,因为我们有:

ortho2D left right bottom up = ortho left right bottom up (-1) 1

然而,根据OpenGL spec,从OpenGL 3.1开始,即使glOrtho也被弃用了。在撰写本文时,使用ortho代替ortho2D使用此等效项。

我注意到一位评论者也遇到了perspective功能的麻烦。这是在不使用GLU的情况下自己实现它的一种方法(但仍使用OpenGL 3.1中不推荐使用的函数):

import qualified Graphics.Rendering.OpenGL as GL

perspective :: GL.GLdouble -> GL.GLdouble -> GL.GLdouble -> GL.GLdouble -> IO ()
perspective fovy aspect near far =
  GL.frustum xmin xmax ymin ymax near far
 where ymax = near * tan (fovy * pi / 360.0)
       ymin = - ymax
       xmax = ymax * aspect
       xmin = ymin * aspect