如何在haskell中存储OpenGL TextureObjects?

时间:2016-07-20 16:35:47

标签: haskell opengl textures glfw

我目前正在尝试使用OpenGL和GLFW-b在haskell中编写图形应用程序。我对OpenGL很新,我在显示TextureObjects时遇到了一些问题。我尝试了两种方法。

我尝试的第一种方法是将纹理存储为TextureObject,然后简单地将其用作渲染函数的输入参数(参见下文)。但是,这并不起作用 the texture objects simply appear as white squares. 我还要注意,程序启动可能需要几秒钟,大概是因为它加载了所有图形。

我尝试的第二件事是将纹理存储为IO TextureObject。 This worked ,但它很慢。它减慢到每秒几帧。我怀疑这是因为纹理需要在每次绘制时重新加载。为了测试这个,我在程序运行时重命名了纹理,实际上程序崩溃了,确认每次迭代都需要重新加载纹理。

纹理加载了函数

loadTexture' :: FilePath -> IO TextureObject
loadTexture' f = do
    tex <- either error id <$> readTexture f

    textureFilter Texture2D $= ((Linear', Nothing), Linear')

    return tex

并使用

进行渲染
renderTexture :: Area -> Area -> TextureObject -> IO()
renderTexture window area tex =
    let (x,x') = xRangeToGL window $ getXRange area
        (y,y') = yRangeToGL window $ getYRange area

     in do textureBinding Texture2D $= Just tex
           renderPrimitive Quads $ do
               col
               txc 1 1 >> ver x' y'
               txc 1 0 >> ver x' y
               txc 0 0 >> ver x  y
               txc 0 1 >> ver x  y'
    where col     = color    (Color3 1.0 1.0 1.0 :: Color3    GLfloat)
          ver x y = vertex   (Vertex2 x y        :: Vertex2   GLfloat)
          txc u v = texCoord (TexCoord2 u v      :: TexCoord2 GLfloat)

OpenGL设置

clearColor            $= Color4 r g b 1.0
depthFunc             $= Just Lequal
blendFunc             $= (SrcAlpha, OneMinusSrcAlpha)
normalize             $= Enabled
texture Texture2D     $= Enabled
shadeModel            $= Smooth

这是我的第一篇文章,所以请告诉我,如果我错过了什么,谢谢你的帮助!

糟糕的做法解决方案:

我已经提出了一个解决方案,我已将其添加为编辑,而不是解决方案,因为我不确定这是一个好的做法 - 这不是我想要的答案类型有这篇文章,但它仍然可以用于那些希望回答的人。

使用loadTexture

致电unsafeCoerce
unsafePerformIO $ loadTexture "foo/bar.png"

的工作原理。但是,将loadTexture'函数重写为

loadTexture' :: FilePath -> IO TextureObject
loadTexture' f = do
    let tex = unsafePerformIO $ either error id <$> readTexture f

    textureFilter Texture2D $= ((Linear', Nothing), Linear')

    return tex

不起作用。

0 个答案:

没有答案