2013-10-20 3 views
1

Я пытаюсь загрузить изображение в текстуру OpenGL, и я не уверен, как разрешить ошибки типа, которые я получаю. Основываясь на тексте ошибки, я думаю, что где-то в моем GL.texImage2D звоните, я разобрался, но здесь нет ничего плохого.Haskell загружает текстуру OpenGL с ошибкой типа JuicyPixels-repa

import Graphics.Rendering.OpenGL as GL 
import Graphics.Rendering.OpenGL (($=)) 

import Codec.Picture.Repa as Repa 

newImage fname = do 
    img <- Repa.readImage fname 
    case img of 
     Left _ -> return Nothing 
     Right x -> do 
      let (dat, w, h) = Repa.toForeignPtr . Repa.reverseColorChannel $ x 

      [tex] <- genObjectNames 1 
      GL.textureBinding GL.Texture2D $= Just tex 
      withForeignPtr dat $ \ptr -> do 
       (GL.texImage2D 
        Nothing 
        GL.NoProxy 
        0 
        GL.RGBA8 
        (GL.TextureSize2D (fromIntegral w) (fromIntegral h)) 
        0 
        (GL.PixelData GL.RGBA GL.UnsignedByte ptr)) 
      return $ Just tex 

Вот ошибка, которую я получаю.

No instance for (TwoDimensionalTextureTarget (Maybe a0)) 
    arising from a use of `texImage2D' 
Possible fix: 
    add an instance declaration for 
    (TwoDimensionalTextureTarget (Maybe a0)) 
In a stmt of a 'do' block: 
    (texImage2D 
    Nothing 
    NoProxy 
    0 
    RGBA8 
    (TextureSize2D (fromIntegral w) (fromIntegral h)) 
    0 
    (PixelData RGBA UnsignedByte ptr)) 
In the expression: 
    do { (texImage2D 
      Nothing 
      NoProxy 
      0 
      RGBA8 
      (TextureSize2D (fromIntegral w) (fromIntegral h)) 
      0 
      (PixelData RGBA UnsignedByte ptr)) } 
In the second argument of `($)', namely 
    `\ ptr 
    -> do { (texImage2D 
       Nothing 
       NoProxy 
       0 
       RGBA8 
       (TextureSize2D (fromIntegral w) (fromIntegral h)) 
       0 
       (PixelData RGBA UnsignedByte ptr)) }' 

ответ

4

The type signature of texImage2D является

texImage2D :: TwoDimensionalTextureTarget t 
      => t -> Proxy -> Level -> PixelInternalFormat -> TextureSize2D -> Border -> PixelData a -> IO() 

instances of class TwoDimensionalTextureTarget являются TextureTargetCubeMapFace, TextureTargetCubeMap и TextureTarget2D. Ни один из них не является синонимом типа для любого типа формы Maybe t. Поэтому предоставление Nothing в качестве первого аргумента textImage2D не будет проверяться. (Могут быть и другие ошибки - я просто искал соответствующие типы из сообщения об ошибке на Hackage.)

+3

NB Правильный ответ в вопросе _if_ вы используете старую версию OpenGL (2.8.0.0). Судя по его сообщению об ошибке, он не использует старую версию (возможно, используя 2.9.0.0), как и этот ответ. –

+0

Это была проблема, я не понимал, что смотрю на старые документы. Большое спасибо! – chanko08

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