2012-05-06 16 views
12

मैं हास्केल, ओपनजीएल और रसदार पिक्सल लाइब्रेरी का उपयोग करके बनावट कैसे लोड करूं?हास्केल ओपनजीएल में रसदार पिक्सेल बनावट लोडिंग?

मैं इस रूप में जहाँ तक प्राप्त कर सकते हैं:

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 को यह परिवर्तित? मुझे लगता है कि मुझे वेक्टर वर्ड 8 और पिक्सेलडाटा (ओपनजीएल को पहचानने के लिए) के बीच रूपांतरण करने की आवश्यकता है

+0

ध्यान दें कि यह आंशिक रूप से JuicyPixels-Repa के लिए सहायक था, लेकिन इसे रेपा 3.0 (जीएचसी 7.4 या ऊपर) के लिए अद्यतन करने की आवश्यकता है। –

+0

ओह। मैं भूल गया कि मैंने नए प्रतिनिधि के लिए जेपी-रेपा अपडेट करने के लिए पहले से ही कुछ काम किया है। वाह। –

उत्तर

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) 

ध्यान दें कि रसदार हमेशा एक RGBA छवि वापस नहीं देता है। इस आदेश से पहले, आप में बनावट डाटा स्टोर करने के लिए एक बनावट वस्तु बाध्य है करने के लिए Btw,

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

मदद के लिए धन्यवाद! मुझे लगता है कि इसे 'बाइट' के बजाय 'बिना हस्ताक्षर किए गए' होना चाहिए। इसके अलावा यह काम किया। – Mark

+0

ओपनजीएल 3.x (हैकेल पैकेज संस्करण 3.x, ओपनजीएल संस्करण 3.x के लिए) 'texImage2D' के पहले तर्क को' कुछ भी नहीं 'से' Texture2D' 'में बदलें। – kolen

संबंधित मुद्दे