2014-07-01 41 views
1

您可以提供一个关于如何在Haskell中加载texImage2D(来自OpenGL)和readImage(来自JuicyPixels库)的纹理的例子吗?如何使用Haskell中的JuicyPixels库加载OpenGL纹理

我知道已经有类似的问题here但因为我是一个新手,我无法使这个例子的作品。我需要完整的代码,也许还解释了它是如何工作的...

+0

所有这些都是为了得到JP图像(它只是一个'Vector')的底层表示,然后使用'texImage2D'。你可以在这里找到'texImage2D'的文档(http://www.cs.sfu.ca/~haoz/teaching/htmlman/teximage2d.html)。 – user2407038

回答

0

对不起,我不知道如何操作JuicyPixels,但我已经在OpenGL中进行纹理加载。

它有点复杂。它会从几个文件中加载纹理,假设它们是纹理类(包含纹理中的多个图像)。

您可以检查一下这个方案的具体纹理渲染的部分(由切割不必要的部分),并找出如何将JuicePixels图像转换为原始像素颜色阵列(在utils模块中查看bindBMPTexture函数)

祝您好运!

import   Data.ByteString   (ByteString(..)) 
import qualified Data.ByteString as BS 
import qualified Data.ByteString.Unsafe as BSU 
import   Graphics.UI.GLUT 
import   Graphics.Rendering.OpenGL (($=)) 
import qualified Graphics.Rendering.OpenGL as GL 
import qualified Codec.BMP as BMP 
import   Foreign.ForeignPtr 
import   Foreign.Ptr 
import   Control.Monad 
import   Unsafe.Coerce 
import qualified Graphics.UI.GLFW as GLFW 
import   Data.IORef 
import   Data.List 
import qualified Data.Map as Map 
import   Data.Maybe 
import OpenGLUtils 

data TextureInfo = TextureInfo GL.TextureObject (Int, Int) 
data ImageTexture = ImageTexture String (Int, Int) (Int, Int) 
images = [ ImageTexture "data/bricks.bmp" (0, 0) (64, 16) 
     , ImageTexture "data/bricks.bmp" (0, 16) (64, 16) 
     , ImageTexture "data/bricks.bmp" (0, 32) (64, 16) 
     , ImageTexture "data/bricks.bmp" (0, 48) (64, 16) 
     ] 

main = do 
    GLFW.initialize 
    GLFW.openWindow (GL.Size (gsizei oSCREEN_WIDTH) (gsizei oSCREEN_HEIGHT)) [GLFW.DisplayAlphaBits 8] GLFW.Window 
    GLFW.windowTitle $= "Texture demo" 
    GL.shadeModel $= GL.Smooth 
    GL.lineSmooth $= GL.Enabled 
    GL.blend  $= GL.Enabled 
    GL.blendFunc $= (GL.SrcAlpha, GL.OneMinusSrcAlpha) 
    GL.lineWidth $= 1.5 
    GL.clearColor $= Color4 0 0 0 0 

    GLFW.windowSizeCallback $= \ [email protected](GL.Size w h) -> do 
     GL.viewport $= (GL.Position 0 0, size) 
     GL.matrixMode $= GL.Projection 
     GL.loadIdentity 

    texturesMap <- loadTextures 
    glfwStaticRender $ do 
    drawTexture_ texturesMap $ images !! 0 

    GLFW.closeWindow 
    GLFW.terminate 

loadTextures :: IO (Map.Map String TextureInfo) 
loadTextures = do 
    let paths = nub $ map (\(ImageTexture path _ _) -> path) images 
    texs <- GL.genObjectNames (length paths) 
    let zippedMap = zip paths texs 
    sizes <- forM zippedMap $ \(path, tex) -> 
     bindBMPTexture tex path 
    return $ Map.fromList (zipWith (\(path,tex) size -> (path, TextureInfo tex size)) zippedMap sizes) 

drawTexture_ textureMap (ImageTexture path (posX, posY) (sizeX, sizeY)) = do 
    let (TextureInfo tex (tSizeX, tSizeY)) = fromJust $ Map.lookup path textureMap 
    drawTexture tex (tSizeX, tSizeY) (posX, posY) (sizeX, sizeY) 
+1

我只是看了一下代码,我发现在bindBMPTexture中有一些我需要做的/知道加载纹理,我甚至不需要JuicyPixels库,我可以使用BMP包作为utils库!非常感谢,我可以从你的代码中学到很多东西! – Manuel