Рендеринг PNG изображений с использованием OpenGL в Haskell

Я новичок в Haskell и создаю игру в шахматы, используя OpenGL (с помощью Graphics.UI.GLUT) для пользовательского интерфейса. Я пытаюсь сделать PNG изображения для шахматных фигур.

Я читал, что изображения могут быть преобразованы в TextureObject и затем оказал, но не смог найти никаких полезных ресурсов, чтобы знать, как это сделать.

Вот так выглядит мой код для генерации шахматной доски

drawSquare :: BoardSquare -> IO ()
drawSquare ((x,y,z),(r,g,b)) = preservingMatrix $ do
    color $ Color3 r g b
    translate $ Vector3 x y z
    drawCube -- this will draw a square of appropriate size

-- Display Callback
display :: IORef GameState -> DisplayCallback
display gameState = do
    gstate <- get gameState
    clear [ColorBuffer]
    forM_ (getBoardPoints gstate) $ drawSquare -- drawing all 64 squares here
    flush

Может ли кто-нибудь помочь мне визуализировать изображение PNG в любой данный момент x а также y координаты окна с заданным путем к файлу?

2 ответа

Предложение: так как вы новичок в Haskell, вместо того, чтобы погружаться прямо в сырье OpenGL для вашей игры в шахматы, вы смотрели на библиотеки, которые могли бы помочь вам сделать OpenGL Полегче? Я бы порекомендовал глянец, и похоже, у глянец-игры есть вспомогательная функция для загрузки .png файл в память готов для использования в вашей игре. Удачи!:-)

Вот способ, которым я пользуюсь.

Во-первых, используйте пакет gl-capture, Это старый, но работает хорошо. Генерирует ppm изображений.

import           Graphics.Rendering.OpenGL.Capture (capturePPM)

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

Теперь, когда у вас есть ppm image, у вас есть два варианта: преобразовать его с помощью ImageMagick или использовать пакет Haskell для преобразования. Есть хороший: он называется hip, Вот модуль, который я использую:

module Utils.ConvertPPM
  where
import           Control.Monad    (when)
import           Graphics.Image
import           System.Directory (removeFile)

convert :: FilePath -> FilePath -> Bool -> IO ()
convert input output remove = do
  ppm <- readImageRGBA VU input
  writeImage output ppm
  when remove $ removeFile input

Не стесняйтесь, если вам нужна дополнительная помощь.

Вот вид ответного вызова клавиатуры, который я использую:

keyboard :: IORef GLfloat -> IORef GLfloat -> IORef GLfloat -> IORef GLint
         -> KeyboardCallback
keyboard rot1 rot2 rot3 capture c _ =
  case c of
    'r' -> rot1 $~! subtract 1
    't' -> rot1 $~! (+1)
    'f' -> rot2 $~! subtract 1
    'g' -> rot2 $~! (+1)
    'v' -> rot3 $~! subtract 1
    'b' -> rot3 $~! (+1)
    'c' -> do
      i <- get capture
      let ppm = printf "pic%04d.ppm" i
          png = printf "pic%04d.png" i
      (>>=) capturePPM (B.writeFile ppm)
      convert ppm png True
      capture $~! (+1)
    'q' -> leaveMainLoop
    _   -> return ()

Затем нажмите "c", чтобы сделать снимок. Обратите внимание, что преобразование из ppm в png медленный. Особенно, если вы собираетесь делать анимацию. Для анимации я скорее использую ppm только потом конвертирую с помощью ImageMagick.

Другие вопросы по тегам