تحميل صورة OpenGL مع صورة SDL
سؤال
كما يقول أعلاه:كيف يمكنني استخدام مرافق تحميل الصور الخاصة بـ صورة SDL ملزمة لهاسكل لتحميل أ برنامج OpenGL الملمس، كما تفعل كثيرًا في لغة C.تدعم SDL-image مجموعة متنوعة من تنسيقات الصور، ولكنها توفر فقط ملف Surface
نوع البيانات.ل glTexImage2D
, يبدو أنني بحاجة إلى تقديم شيء مختلف، أ PixelData
نوع البيانات.
هل هناك طريقة للحصول على بيانات الصورة دون اللجوء إلى لغة C؟حتى أنني سأستخدم بعض المكتبات الأخرى، طالما أنها توفر لي دعم PNG وJPG وTGA.
المحلول
لإنجاز هذا العمل مع استخدام أسطح SDL وروابط Haskell surfaceGetPixels
يعود Pixels
وهو نوع الاسم المستعار ل Ptr PixelData
و PixelData
هو إعلان بيانات فارغ.السبب في ذلك هو أن تنسيق البكسل لسطح SDL وعدد البتات لكل بكسل يمكن أن يكون أي شيء تقريبًا.لذا، إذا كان لديك تنسيق 32 بت في الثانية، فسوف تقوم بإلقاء المؤشر ليقول Ptr Word32
استخدام castPtr
.
فيما يلي مثال للحصول على/وضع بكسل:
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 لتحميل النسيج.
نصائح أخرى
ربما Codec.Image.DevIL يوفر ما تبحث عنه؟اصدق ذلك يجب على أي حال.