2012-05-06 4 views
12

Как загрузить текстуру с помощью Haskell, OpenGL и библиотеки JuicyPixels?Загрузка текстуры JuicyPixels в Haskell OpenGL?

я могу получить, насколько это:

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

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

+0

Обратите внимание, что это частично то, что JuicyPixels-Repa было полезно, но для обновления Repa-3.0 (GHC 7.4 или выше) требуется обновление. –

+0

К сожалению. Я забыл, что уже проделал определенную работу по обновлению JP-repa для новой репа. Ура. –

ответ

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; вам не нужно импортировать каждую вещь индивидуально, если вы этого не хотите.

+0

Спасибо за помощь! Я думаю, что это должно быть 'UnsignedByte', а не' Byte'. Кроме этого это сработало. – Mark

+0

Для OpenGL 3.x (пакет haskell версии 3.x, а не OpenGL версии 3.x) заменить первый аргумент 'texImage2D' из' Nothing' в 'Texture2D'. – kolen

Смежные вопросы