2017-04-07 28 views
2

私はハスケルを初めて使い、OpenGLGraphics.UI.GLUTを使用)を使用してUI用にチェスゲームを構築しています。私はチェスのためのPNG画像をレンダリングしようとしています。ハスケルでOpenGLを使用して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 

誰も私が与えられたファイルのパスとウィンドウの任意のxy座標にPNG画像をレンダリング助けることができますか?

+1

あなたの質問に固有ではないかもしれませんが、neheチュートリアル(Haskellポート:http://hackage.haskell.org/package/nehe-tuts、Cのオリジナルはhttp: //nehe.gamedev.net/)?私は分かりませんが、おそらくこれが助けになります... – MichaelO

+0

OpenGLで具体的にしたいのですか、2Dグラフィックスを画面上に表示したいですか?後者の場合、SDL2は非常に単純な選択肢であり、良好なハズケルバインディングがあります。 –

+0

キーボードのアクションとゲームプレイを備えたチェスボードの合計がOpenGLで用意されています。 PNGイメージをレンダリングするためにOpenGLを使用する場合は、OpenGLを使用する必要はありません。 – codesome

答えて

3

提案:あなたはHaskellのに新しく追加されたので、代わりにダイビングのストレートあなたのチェスゲームの生OpenGLに、あなたはOpenGLを簡単にする助けることができるライブラリを見てきましたか? glossをお勧めします。gloss-gameには、.pngファイルをゲームに使用できるようにロードするために、helper functionがあります。がんばろう! :-)

+1

はい、光沢がよりシンプルになりました。しかし、私はまずOpenGLを見つけました。イメージレンダリングの部分を除いてトータルゲームが用意されていたので、今はそれをマイグレートすることができません。 OpenGLでそのヘルパー関数を使用することは可能ですか? – codesome

+1

私はOpenGL Haskellのバインディングには慣れていないので、光沢のようなものをお勧めします。少しのグーグルの後、2Dテクスチャをロードするために必要な関数は 'texImage2D'です。非常に低いレベルです(イメージがメモリ内に保持されている場所へのポインタを渡す必要があります)。 [ここで](https://gist.github.com/danbst/470f7e23a14cab4e6e3e)は、私が '.bmp'からテクスチャを読み込むためにオンラインで見つけた要点です。 [JuicyPixels](https://hackage.haskell.org/package/JuicyPixels)は、あなたが '.png'ファイルからビットマップを取得するのを助けるかもしれません。がんばろう! :-) –

+0

リソースありがとうございます:)これは他の人にも役立つことを願っています。とにかく、私たちは代わりに頂点を与えることによって数字を描くことにしました。画面のちらつきに関する問題に直面することはありません。 – codesome

0

ここで私が使用している方法です。

最初に、パッケージgl-captureを使用してください。それは古いですが、うまくいきます。それはppmイメージを生成します。

import   Graphics.Rendering.OpenGL.Capture (capturePPM) 

パッケージの適用には手助けが必要ですか?キーボードコールバックが必要です。私は必要に応じて助けることができます、お願いしてください。

今度はppmイメージを持っていれば、ImageMagickで変換するか、またはHaskellパッケージを使ってイメージを変換するという2つの選択肢があります。良いものがあります:と呼ばれています。私が使用しているモジュールは次のとおりです。

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で変換します。

関連する問題