«неизвестная запись GLU gluOrtho2D» с использованием opengl в Haskell - PullRequest
10 голосов
/ 18 октября 2011

Я нахожусь на Ubuntu 11.10 с использованием ghc версии 7.0.3.20110330, на котором запущены "обновления текущей версии" драйвера дисплея nvidia.Вы можете воспроизвести, запустив:

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

Но я могу запустить opengl, и он отлично работает.Я попробовал glxgears, и он запустился нормально, и я запустил тест OpenGL, и он тоже хорошо работал.

Версии like hasllll opengl результат выполнения:

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 ]

2 голосов
/ 29 октября 2011

Это определенная ошибка.Существует проблема с компоновщиком (и я не уверен, относится ли это к 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

Запустите cabal install на GLURaw после применения этого патча, и он должен избавиться от этой проблемы.

1 голос
/ 18 октября 2011

У меня все работает, меняя шаг компиляции на:

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 2011.2.0.1

0 голосов
/ 13 февраля 2012

Похоже, что использование GLU в значительной степени устарело, начиная с OpenGL 3.0, из которого используются большие версии, начиная с пакетов 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 , кажется, что даже glOrthoустарело с версии OpenGL 3.1.На момент написания статьи использование 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
0 голосов
/ 18 октября 2011

Я скомпилировал его в моей системе (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

Возможно, вы могли бы попытаться найти простой пример C / C ++, использующий gluOrtho2D, и посмотреть, работает ли он?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...