2011-10-18 9 views
10

Sono su Ubuntu 11.10 utilizzando ghc versione 7.0.3.20110330, in esecuzione "aggiornamenti della versione corrente" del driver video NVIDIA. È possibile riprodurre eseguendo:"sconosciuto GLU entry gluOrtho2D" utilizzando OpenGL in Haskell

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

Ma posso eseguire opengl e funziona correttamente. Ho provato glxgears e ha funzionato bene e ho eseguito un benchmark opengl e ha funzionato bene pure.

versioni di Haskell librerie OpenGL risultato dell'esecuzione:

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 
+0

Sto avendo lo stesso problema e le patch non funzionano. (Ho corretto tutte le 3 scelte in HSGLURaw.c) ghc 7.0.3, OpenGL-2.4.0.2, OpenGLRaw-1.1.0.2, GLURaw-1.1.0.1, ubuntu 11.10. Cerchio: errore utente (voce GLU sconosciuta gluOrtho2D) Anche il collegamento con flag -l non si risolve. –

+0

Ho lo stesso errore con gluPerspective invece di gluOrtho2D. Usando OpenGL-2.4.0.2, OpenGLRaw-1.1.0.2, GLURaw-1.1.0.1 e ubuntu 11.10 – Zhen

+0

Per me (Ubuntu 11.10, ghc-7.4.1) questo problema è risolto con queste versioni: OpenGLRaw-1.2.0.0 GLURaw-1.2 .0.0 OpenGL-2.5.0.0 – shahn

risposta

2

Questo è un bug definito. C'è un problema con il linker (e non sono sicuro se questo è specifico per 11.10 o per GHC 7.0+). Ecco come è stato spiegato a me: il linker decide in sostanza che, visto che non stai collegando staticamente a libglut, sarà solo di ottimizzare da non collegando il vostro eseguibile per affatto. È possibile aggirare il problema applicando la seguente patch per 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 

Run cabal install su GLURaw dopo l'applicazione di questa patch, e dovrebbe sbarazzarsi di questo problema.

1

ho capito funziona cambiando compilare passo per:

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

ho le versioni (Non ho installato 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 ] 

EDIT: sto usando Ubuntu 11.04 e GHC 7.0.3 con Haskell Platform 2011.2.0.1

0

ho compilato sul mio sistema (Mac OS 10.7.2 con GHC 7.2.1) e ha funzionato qui, in modo che il programma dovrebbe sii corretto Le mie versioni dei pacchetti vengono

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

Forse si potrebbe provare a trovare un semplice C/C++ di esempio che utilizza gluOrtho2D e vedere se funziona?

+0

Sì, so che il programma è corretto. La domanda è ... come faccio a capire perché non verrà eseguito sul mio sistema. – mentics

0

sembra che l'uso di GLU è stata ampiamente deprecata come di OpenGL 3.0, da cui una maggiore versioni sono stati in uso dal pacchetti di OpenGL 2.4 di Haskell. C'è una menzione sul OpenGL wiki che dice:

GLU - la libreria OpenGL Utility è una libreria aggiuntiva che contiene una manciata di funzioni per compiti supplementari. Era tradizionale e può essere trovato in un sacco di tutorial ed esempi. Ma la GLU utilizza molte funzionalità OpenGL che ora sono deprecate. La matrice sporgenza interna non deve più essere utilizzato, in modo che il programmatore dovrebbe usare una sostituzione per gluPerspective, che invece di aggiornare la matrice di proiezione interna tornerà questa matrice.

Ciò indica che le funzioni in Graphics.Rendering.OpenGL.GLU.Matrix non devono più essere utilizzate.Ciò include:

ortho2D 
perspective 
lookAt 
pickMatrix 
project 
unProject 
unProject4 

ho il sospetto che questo potrebbe essere il motivo per cui il codice viene compilato, ma non riesce quando si utilizza ortho2D.

Si potrebbe essere tentati di utilizzare glOrtho invece di gluOrtho2D, dal momento che abbiamo:

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

Tuttavia, secondo il OpenGL spec, sembra che anche glOrtho è deprecato come di OpenGL 3.1. Al momento della scrittura, utilizzando ortho anziché ortho2D funziona utilizzando questa equivalenza.

Ho notato che anche un commentatore ha avuto problemi con la funzione perspective. Ecco un modo per implementarlo da soli senza utilizzare GLU (ma ancora utilizzando una funzione deprecata in 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 
Problemi correlati