1

上記のように:Cでよくあるように、HaskellにバインドするSDL画像の画像読み込み機能を使用してOpenGLテクスチャを読み込むにはどうすればよいですか。SDL画像はさまざまな画像形式をサポートしていますが、Surfaceデータ・タイプ。のためglTexImage2Dに、私は何か違うもの、PixelDataデータ型を提供する必要があるようです。

Cに頼らずに画像データを取得する方法はありますか?PNG、JPG、TGAをサポートしている限り、他のライブラリを使用することもできます。

4

2 に答える 2

2

これをSDLサーフェスとHaskellバインディングで機能させるには、これを使用して、の型エイリアスであり、空のデータ宣言であるをsurfaceGetPixels返します。これは、SDLサーフェスのピクセル形式とピクセルあたりのビット数がほぼすべてである可能性があるためです。したがって、基本的に32bpp形式の場合は、を使用して言うようにポインタをキャストします。PixelsPtr PixelDataPixelDataPtr Word32castPtr

ピクセルを取得/配置する例を次に示します。

getPixel32 :: MonadIO m => Surface -> Int -> Int -> m Pixel
getPixel32 s x y = liftIO $ do
    ps <- surfaceGetPixels s
    assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
        Pixel `liftM` peekElemOff (castPtr ps :: Ptr Word32) offset
 where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x

setPixel32 :: MonadIO m => Surface -> Int -> Int -> Pixel -> m ()
setPixel32 s x y (Pixel pixel) = liftIO $ do
    ps <- surfaceGetPixels s
    assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
        pokeElemOff (castPtr ps :: Ptr Word32) offset pixel
 where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x

同様に、ポインタを特定のポインタタイプにキャストし、それをglTexImage2Dに渡して、テクスチャをアップロードできます。

于 2011-03-26T23:06:03.623 に答える
1

おそらくCodec.Image.DevILはあなたが探しているものを提供しますか?とにかくそうすべきだと思います。

于 2011-03-26T15:39:48.900 に答える