Pregunta sobre opengl, haskell – ¿Cargando JuicyPixels textura en Haskell OpenGL?

12

¿Cómo puedo cargar una textura utilizando Haskell, OpenGL y la biblioteca JuicyPixels?

Puedo llegar tan lejos como esto:

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

¿Cómo puedo convertir esto en un TextureObject? Creo que necesito hacer una conversión entre un Vector Word8 y PixelData (para que OpenGL lo reconozca)

Tenga en cuenta que esto es en parte para lo que JuicyPixels-Repa fue útil, pero necesita actualización para Repa-3.0 (GHC 7.4 o superior). Thomas M. DuBuisson
Ups. Olvidé que ya había hecho un trabajo para actualizar JP-repa para la nueva repa. Hurra. Thomas M. DuBuisson

Tu respuesta

1   la respuesta
7

Usas eltexImage2D función. Lo invocarías así:

<code>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)
</code>

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

<code>ImageY8, ImageYA8, ImageRGB8, ImageRGBA8, ImageYCrCb8
</code>

Además, antes de este comando, debe haber vinculado un objeto de textura para almacenar los datos de textura en.

<code>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
</code>

Por cierto, muchas de esas importaciones se agregan automáticamente al importarGraphics.Rendering.OpenGL; no tienes que importar cada cosa individualmente si no quieres.

¡Gracias por la ayuda! Creo que debería serUnsignedByte más bien queByte. Aparte de eso esto funcionó. Mark
Para OpenGL 3.x (paquete de haskell versión 3.x, no OpenGL versión 3.x) reemplace el primer argumento detexImage2D desdeNothing aTexture2D. kolen

Preguntas relacionadas