Frage an opengl, haskell – Laden der JuicyPixels-Textur in Haskell OpenGL?

12

Wie lade ich eine Textur mit Haskell, OpenGL und der JuicyPixels-Bibliothek?

Ich kann so weit kommen:

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

Wie konvertiere ich das in ein TextureObject? Ich denke, ich muss eine Konvertierung zwischen einem Vector Word8 und PixelData durchführen (damit OpenGL erkennt)

Hoppla. Ich habe vergessen, dass ich bereits einige Arbeiten durchgeführt habe, um JP-repa für die neue repa zu aktualisieren. Yay. Thomas M. DuBuisson
Beachten Sie, dass JuicyPixels-Repa zum Teil hilfreich war, aber eine Aktualisierung für Repa-3.0 (GHC 7.4 oder höher) benötigt. Thomas M. DuBuisson

Deine Antwort

1   die antwort
7

Sie verwenden dietexImage2D Funktion. Sie würden es so aufrufen:

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

Beachten Sie, dass Juicy nicht immer ein RGBA-Bild zurückgibt. Sie müssen mit den verschiedenen Bildvarianten umgehen:

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

Außerdem müssen Sie vor diesem Befehl ein Texturobjekt gebunden haben, um die Texturdaten in zu speichern.

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

Übrigens werden viele dieser Importe beim Import automatisch hinzugefügtGraphics.Rendering.OpenGL; Sie müssen nicht jedes Objekt einzeln importieren, wenn Sie dies nicht möchten.

Danke für die Hilfe! Ich denke das sollte es seinUnsignedByte eher, alsByte. Davon abgesehen funktionierte dies. Mark
Ersetzen Sie für OpenGL 3.x (Haskell-Paket Version 3.x, nicht OpenGL Version 3.x) das erste Argument vontexImage2D vonNothing zuTexture2D. kolen

Verwandte Fragen