2012-05-06 99 views
12

如何使用Haskell,OpenGL和JuicyPixels庫加載紋理?在Haskell OpenGL中加載JuicyPixels紋理?

我能得到儘可能的:

loadImage :: IO() 
loadImage = do image <- readPng "data/Picture.png" 
       case image of 
       (Left s) -> do print s 
           exitWith (ExitFailure 1) 
       (Right d) -> do case (ImageRGBA i) -> do etc... 

如何將它轉換爲一個TextureObject?我想我需要做一個矢量Word8和PixelData之間的轉換(用於OpenGL識別)

+0

請注意,這部分是JuicyPixels-Repa有幫助的,但它需要更新Repa-3.0(GHC 7.4或更高版本)。 –

+0

糟糕。我忘了我已經做了一些工作來更新JP-repa的新補丁。好極了。 –

回答

7

您使用texImage2D函數。你可以這樣調用它:

import Data.Vector.Storable (unsafeWith) 

import Graphics.Rendering.OpenGL.GL.Texturing.Specification (texImage2D, Level, Border, TextureSize2D(..)) 
import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable (Proxy(..), PixelInternalFormat(..)) 
import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (PixelData(..)) 

-- ... 

(ImageRGBA8 (Image width height dat)) -> 
    -- Access the data vector pointer 
    unsafeWith dat $ \ptr -> 
    -- Generate the texture 
    texImage2D 
     -- No cube map 
     Nothing 
     -- No proxy 
     NoProxy 
     -- No mipmaps 
     0 
     -- Internal storage format: use R8G8B8A8 as internal storage 
     RGBA8 
     -- Size of the image 
     (TextureSize2D width height) 
     -- No borders 
     0 
     -- The pixel data: the vector contains Bytes, in RGBA order 
     (PixelData RGBA UnsignedByte ptr) 

請注意,Juicy並不總是返回一個RGBA圖像。你必須處理每一個不同的圖像變化:

ImageY8, ImageYA8, ImageRGB8, ImageRGBA8, ImageYCrCb8 

而且,這個命令之前,你必須已綁定一個紋理對象的紋理數據存儲在

import Data.ObjectName (genObjectNames) 
import Graphics.Rendering.OpenGL.GL.Texturing.Objects (textureBinding) 
import Graphics.Rendering.OpenGL.GL.Texturing.Specification (TextureTarget(..)) 

-- ... 

-- Generate 1 texture object 
[texObject] <- genObjectNames 1 

-- Make it the "currently bound 2D texture" 
textureBinding Texture2D $= Just texObject 

BTW,很多的。這些導入是在您導入Graphics.Rendering.OpenGL時自動添加的;如果你不想要,你不必單獨導入每一件東西。

+0

感謝您的幫助!我認爲它應該是'UnsignedByte'而不是'Byte'。除此之外,這工作。 – Mark

+0

對於OpenGL 3.x(haskell軟件包版本3.x,不是OpenGL版本3.x),將'texImage2D'的第一個參數從'Nothing'替換爲'Texture2D'。 – kolen