Вопрос по haskell, opengl – Загрузка текстуры JuicyPixels в Haskell OpenGL?

12

Как загрузить текстуру, используя Haskell, OpenGL и библиотеку JuicyPixels?

Я могу получить так далеко, как это:

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

Как мне преобразовать это в TextureObject? Я думаю, что мне нужно сделать преобразование между Vector Word8 и PixelData (для распознавания OpenGL)

Обратите внимание, что это отчасти то, для чего была полезна JuicyPixels-Repa, но она нуждается в обновлении для Repa-3.0 (GHC 7.4 или выше). Thomas M. DuBuisson
К сожалению. Я забыл, что уже проделал некоторую работу по обновлению JP-repa для нового repa. Ура. Thomas M. DuBuisson

Ваш Ответ

1   ответ
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

Кстати, многие из этих импортов добавляются автоматически при импортеGraphics.Rendering.OpenGL; вам не нужно импортировать каждую вещь по отдельности, если вы этого не хотите.

Спасибо за помощь! Я думаю, что это должно бытьUnsignedByte скорее, чемByte, Кроме этого это сработало. Mark
Для OpenGL 3.x (версия 3.x пакета haskell, а не OpenGL 3.x) замените первый аргументtexImage2D отNothing вTexture2D.

Похожие вопросы