2017-04-07 6 views
2

저는 하스켈을 처음 사용하고 UI로 OpenGL (Graphics.UI.GLUT 사용)을 사용하여 체스 게임을 제작 중입니다. 체스 조각을위한 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 자습서 (하스켈 포트 : http://hackage.haskell.org/package/nehe-tuts, C의 원본은 http : //nehe.gamedev.net/)? 나도 몰라,하지만 어쩌면이게 도움이 될거야. – MichaelO

+0

OpenGL에 구체적으로 표시하고 싶습니까, 아니면 2D 그래픽을 화면에 표시하고 싶습니까? 후자의 경우 SDL2는 매우 간단한 대안이며 좋은 haskell 바인딩이 있습니다. –

+0

키보드 액션 및 게임 플레이가있는 전체 체스 보드가 OpenGL에서 준비되었습니다. OpenGL에서 PNG 이미지를 렌더링하는 데 필요한 모든 것이 좋으며 OpenGL에있을 필요는 없습니다. – codesome

답변

3

제안 : 당신이 대신 똑바로 체스 게임에 대한 원시 OpenGL에 다이빙에, 하스켈에 새로운 당신이 도움이 될 도서관에서 보았다 가지고 있기 때문에 당신이 OpenGL 쉽게? gloss을 권하고 gloss-game.png 파일을 게임에 사용할 준비가 된 파일로로드하려면 helper function이 있어야합니다. 행운을 빕니다! :-)

+1

예, 광택이 더 간단했을 것입니다. 하지만 OpenGL을 처음 접했을 때 이미지 렌더링 부분을 제외하고는 전체 게임이 준비되었으므로 지금은 (또는 더 이상 좋아하지 않습니다.) 마이그레이션 할 수 없습니다. OpenGL에서 도우미 함수를 사용할 수 있습니까? – codesome

+1

나는 실제로 OpenGL Haskell 바인딩에 익숙하지 않아서 광택과 같은 것을 추천했다.인터넷 검색을 한 후에 2D 텍스쳐를로드하는 데 필요한 함수는'texImage2D' 인 것처럼 보입니다. 매우 낮은 수준입니다 (이미지가 메모리에 저장되는 위치에 대한 포인터를 전달해야합니다). [Here] (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으로 변환하거나 하스켈 패키지로 변환하는 두 가지 옵션이 있습니다. 좋은 것이 있습니다 : 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으로 변환합니다.