2012-05-06 15 views
12

¿Cómo cargo una textura usando Haskell, OpenGL y la biblioteca JuicyPixels?textura de JuicyPixels cargando en Haskell OpenGL?

puedo llegar tan lejos como esto:

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... 

¿Cómo convierto a un TextureObject? Creo que necesito hacer una conversión entre un Vector Word8 y PixelData (para reconocer OpenGL)

+0

Tenga en cuenta que esto es en parte para lo que JuicyPixels-Repa fue útil, pero necesita una actualización para Repa-3.0 (GHC 7.4 o superior). –

+0

Vaya. Olvidé que ya había hecho algo de trabajo para actualizar JP-repa para la nueva reparación. Hurra. –

Respuesta

7

Usted usa la función texImage2D. Lo invocaría así:

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) 

Tenga en cuenta que Juicy no siempre devuelve una imagen RGBA. Usted tiene que manejar cada una de las diferentes variaciones de imagen:

ImageY8, ImageYA8, ImageRGB8, ImageRGBA8, ImageYCrCb8 

Además, antes de este comando, tiene que haber atado un objeto de la textura para almacenar los datos de textura en

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 

Por cierto, muchos de. esas importaciones se agregan automáticamente cuando importa Graphics.Rendering.OpenGL; no tiene que importar cada cosa individualmente si no quiere.

+0

¡Gracias por la ayuda! Creo que debería ser 'UnsignedByte' en lugar de' Byte'. Aparte de eso, esto funcionó. – Mark

+0

Para OpenGL 3.x (paquete haskell versión 3.x, no OpenGL versión 3.x) reemplace el primer argumento de 'texImage2D' de' Nothing' a 'Texture2D'. – kolen