您可以提供一个关于如何在Haskell中加载texImage2D(来自OpenGL)和readImage(来自JuicyPixels库)的纹理的例子吗?如何使用Haskell中的JuicyPixels库加载OpenGL纹理
我知道已经有类似的问题here但因为我是一个新手,我无法使这个例子的作品。我需要完整的代码,也许还解释了它是如何工作的...
您可以提供一个关于如何在Haskell中加载texImage2D(来自OpenGL)和readImage(来自JuicyPixels库)的纹理的例子吗?如何使用Haskell中的JuicyPixels库加载OpenGL纹理
我知道已经有类似的问题here但因为我是一个新手,我无法使这个例子的作品。我需要完整的代码,也许还解释了它是如何工作的...
对不起,我不知道如何操作JuicyPixels,但我已经在OpenGL中进行纹理加载。
它有点复杂。它会从几个文件中加载纹理,假设它们是纹理类(包含纹理中的多个图像)。
您可以检查一下这个方案的具体纹理渲染的部分(由切割不必要的部分),并找出如何将JuicePixels图像转换为原始像素颜色阵列(在utils模块中查看bindBMPTexture
函数)
祝您好运!
import Data.ByteString (ByteString(..))
import qualified Data.ByteString as BS
import qualified Data.ByteString.Unsafe as BSU
import Graphics.UI.GLUT
import Graphics.Rendering.OpenGL (($=))
import qualified Graphics.Rendering.OpenGL as GL
import qualified Codec.BMP as BMP
import Foreign.ForeignPtr
import Foreign.Ptr
import Control.Monad
import Unsafe.Coerce
import qualified Graphics.UI.GLFW as GLFW
import Data.IORef
import Data.List
import qualified Data.Map as Map
import Data.Maybe
import OpenGLUtils
data TextureInfo = TextureInfo GL.TextureObject (Int, Int)
data ImageTexture = ImageTexture String (Int, Int) (Int, Int)
images = [ ImageTexture "data/bricks.bmp" (0, 0) (64, 16)
, ImageTexture "data/bricks.bmp" (0, 16) (64, 16)
, ImageTexture "data/bricks.bmp" (0, 32) (64, 16)
, ImageTexture "data/bricks.bmp" (0, 48) (64, 16)
]
main = do
GLFW.initialize
GLFW.openWindow (GL.Size (gsizei oSCREEN_WIDTH) (gsizei oSCREEN_HEIGHT)) [GLFW.DisplayAlphaBits 8] GLFW.Window
GLFW.windowTitle $= "Texture demo"
GL.shadeModel $= GL.Smooth
GL.lineSmooth $= GL.Enabled
GL.blend $= GL.Enabled
GL.blendFunc $= (GL.SrcAlpha, GL.OneMinusSrcAlpha)
GL.lineWidth $= 1.5
GL.clearColor $= Color4 0 0 0 0
GLFW.windowSizeCallback $= \ [email protected](GL.Size w h) -> do
GL.viewport $= (GL.Position 0 0, size)
GL.matrixMode $= GL.Projection
GL.loadIdentity
texturesMap <- loadTextures
glfwStaticRender $ do
drawTexture_ texturesMap $ images !! 0
GLFW.closeWindow
GLFW.terminate
loadTextures :: IO (Map.Map String TextureInfo)
loadTextures = do
let paths = nub $ map (\(ImageTexture path _ _) -> path) images
texs <- GL.genObjectNames (length paths)
let zippedMap = zip paths texs
sizes <- forM zippedMap $ \(path, tex) ->
bindBMPTexture tex path
return $ Map.fromList (zipWith (\(path,tex) size -> (path, TextureInfo tex size)) zippedMap sizes)
drawTexture_ textureMap (ImageTexture path (posX, posY) (sizeX, sizeY)) = do
let (TextureInfo tex (tSizeX, tSizeY)) = fromJust $ Map.lookup path textureMap
drawTexture tex (tSizeX, tSizeY) (posX, posY) (sizeX, sizeY)
我只是看了一下代码,我发现在bindBMPTexture中有一些我需要做的/知道加载纹理,我甚至不需要JuicyPixels库,我可以使用BMP包作为utils库!非常感谢,我可以从你的代码中学到很多东西! – Manuel
所有这些都是为了得到JP图像(它只是一个'Vector')的底层表示,然后使用'texImage2D'。你可以在这里找到'texImage2D'的文档(http://www.cs.sfu.ca/~haoz/teaching/htmlman/teximage2d.html)。 – user2407038