Pytanie w sprawie haskell, opengl – JuicyPixels ładowanie tekstur w Haskell OpenGL?

12

Jak załadować teksturę przy użyciu biblioteki Haskell, OpenGL i JuicyPixels?

Mogę dojść tak daleko:

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

Jak przekonwertować to na obiekt TextureObject? Myślę, że muszę wykonać konwersję między Vector Word8 i PixelData (aby OpenGL mógł rozpoznać)

Ups. Zapomniałem, że zrobiłem już trochę pracy, aby zaktualizować JP-repa do nowej repa. Yay. Thomas M. DuBuisson
Zauważ, że jest to częściowo przydatne dla JuicyPixels-Repa, ale wymaga aktualizacji dla Repa-3.0 (GHC 7.4 lub nowszy). Thomas M. DuBuisson

Twoja odpowiedź

1   odpowiedź
7

UżywasztexImage2D funkcjonować. Przywołujesz to w ten sposób:

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

Zauważ, że Juicy nie zawsze oddaje obraz RGBA. Musisz poradzić sobie z każdą z różnych odmian obrazu:

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

Ponadto przed tym poleceniem musisz powiązać obiekt tekstury, aby zapisać dane tekstury.

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

BTW, wiele z tych importów jest dodawanych automatycznie podczas importowaniaGraphics.Rendering.OpenGL; nie musisz importować każdej rzeczy indywidualnie, jeśli nie chcesz.

Dla OpenGL 3.x (pakiet haskell w wersji 3.x, a nie OpenGL w wersji 3.x) zastępuje pierwszy argumenttexImage2D zNothing doTexture2D. kolen
Dzięki za pomoc! Myślę, że tak powinno byćUnsignedByte zamiastByte. Poza tym to zadziałało. Mark

Powiązane pytania