Рендеринг 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.