Haskell opengl 纹理 GLFW

2024-04-06

我一直在尝试获取一些仅使用 texcoords 在正方形上显示纹理的脚本。 如果可能的话,您可以编辑脚本,以便它可以正常工作,从那里我可以了解您是如何做到的,因为这就是我学习的方式。

import Control.Monad (unless, when)
import Graphics.Rendering.OpenGL
import qualified Graphics.UI.GLFW as G
import System.Exit
import System.IO
import Texture
import Data.IORef
import Graphics.GLUtil
import qualified Data.Set as Set

main :: IO ()
main = do
    let errorCallback err description = hPutStrLn stderr description
    G.setErrorCallback (Just errorCallback)
    successfulInit <- G.init
    if not successfulInit
        then exitFailure
        else do
          mw <- G.createWindow 640 480 "Simple example, haskell style" Nothing Nothing
          case mw of Nothing -> (G.terminate >> exitFailure)
                     Just window -> do
                                    G.makeContextCurrent mw
                                    preMainLoop window
                                    G.destroyWindow window
                                    G.terminate
                                    exitSuccess



preMainLoop :: G.Window -> IO ()
preMainLoop window = do
    tex <- loadGLTextureFromFile "texture/metal.png"
    clearColor $= Color4 0.9 0.1243 0.2544564 1.0
    depthFunc $= Just Lequal
    blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
    normalize $= Enabled
    texture Texture2D $= Enabled
    shadeModel $= Smooth
    mainLoop tex window


mainLoop :: TextureObject -> G.Window -> IO ()
mainLoop tex window = do
    action <- (G.windowShouldClose window)
    unless action $ do
        viewWindow window
        cal tex
        G.swapBuffers window
        G.pollEvents
        mainLoop tex window

cal tex = do
    preservingMatrix $ do
        rotate 90 (Vector3 1 0 0 :: Vector3 GLfloat)
        withTextures2D [tex] $ draw tex

draw tex = do
    textureBinding Texture2D $= Just tex
    renderPrimitive Quads $ do
    n 0 1 0
    t 0 1 >> v   1  (-1)   1
    t 1 1 >> v   1  (-1) (-1)
    t 1 0 >> v (-1) (-1) (-1)
    t 0 0 >> v (-1) (-1)   1
    where v x y z = vertex (Vertex3 x y z :: Vertex3 GLfloat)
          n x y z = normal (Normal3 x y z :: Normal3 GLfloat)
          t u v   = texCoord (TexCoord2 u v :: TexCoord2 GLfloat)

viewWindow window = do
    (width, height) <- G.getFramebufferSize window
    viewport $= (Position 0 0, Size (fromIntegral width) (fromIntegral height))
    clear [ColorBuffer, DepthBuffer]
    matrixMode $= Projection
    loadIdentity
    perspective 90 (fromIntegral(width)/fromIntegral(height)) 0.01 40
    matrixMode $= Modelview 0

here is the image I have been using enter image description here

module Texture
   (
    loadGLTextureFromFile,

   ) where

import Graphics.Rendering.OpenGL
import Graphics.GLUtil
import Codec.Picture
import qualified Graphics.Rendering.OpenGL as GL
import qualified Graphics.GLUtil as GLU
import qualified Codec.Picture as Pic

loadGLTextureFromFile :: FilePath -> IO GL.TextureObject
loadGLTextureFromFile fp = do
    possibleImage <- Pic.readImage fp
    case possibleImage of
        Left err -> do
                print err
                loadGLTextureFromFile "data/fail texture.png"
        Right (Pic.ImageRGBA8 x) -> convertToGL x GLU.TexRGBA
        Right (Pic.ImageRGBA16 x) -> convertToGL x GLU.TexRGBA
        Right (Pic.ImageRGB8 x) -> convertToGL x GLU.TexRGB
        Right (Pic.ImageRGB16 x) -> convertToGL x GLU.TexRGB
        Right (Pic.ImageYCbCr8 x) -> convertToGL x GLU.TexRGB
        Right _ -> do
                print "image not found"
                loadGLTextureFromFile "data/fail texture.png"
       where
        convertToGL x texCol  = do
            tex <- GLU.loadTexture (GLU.TexInfo 
                                (fromIntegral (Pic.imageWidth x))
                                (fromIntegral (Pic.imageHeight x))
                                texCol (Pic.imageData x))
            textureWrapMode Texture2D S $= (Mirrored, ClampToEdge)
            textureWrapMode Texture2D T $= (Mirrored, ClampToEdge)
            return tex

所以我通过使用修复

loadGLTextureFromFile :: FilePath -> IO GL.TextureObject
loadGLTextureFromFile f = do t <- either error id <$> readTexture f
                             textureFilter Texture2D $= ((Linear', Nothing), Linear')
                             texture2DWrap $= (Mirrored, ClampToEdge)
                             return t
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell opengl 纹理 GLFW 的相关文章

  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • 搜索重写规则

    有什么办法可以浏览或搜索重写规则吗 当我使用像这样的标志时 ddump rule firings or ddump rule rewrites我只是得到了触发的规则的名称以及它引起的重写 但没有得到实际的规则本身 理想情况下 我想通过 GH
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0
  • GLSL NVidia 方形神器

    当 GLSL 着色器在以下 GPU 上生成不正确的图像时 我遇到了问题 GT 430 GT 770 GTX 570显卡760 但在这些上正常工作 英特尔高清显卡 2500英特尔高清4000英特尔4400显卡740MRadeon HD 631
  • 如何在 Haskell 中制作打勾游戏的图案?

    实现有 2 个参数的函数 ticktick 第一个参数是自然数元组 定义游戏场地的行数和列数 第二个列表包含由玩家 x 和玩家 o 轮流玩的坐标给出的井字游戏比赛的记录 打印游戏的实际状态 其中游戏区域将由字符 和 界定 空方块 以及字符
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • Opengl 像素完美 2D 绘图

    我正在研究 2d 引擎 它已经工作得很好 但我不断收到像素错误 例如 我的窗口是 960x540 像素 我从 0 0 到 959 0 画一条线 我希望扫描线 0 上的每个像素都会被设置为一种颜色 但事实并非如此 最右边的像素没有被绘制 当我
  • Visual Studio 2010 中的 SOIL 设置

    我无法得到SOIL http www lonesock net soil html正确使用 Visual Studio 2010 我远非 VS 专家 但据我所知 只需执行以下步骤即可使环境正常运行 属性 gt gt C C gt 常规 gt
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add

随机推荐

  • 直接执行自定义SQL时django-mssql中查询超时过期

    我正在查询一个视图 该视图将返回大量数据 并且需要 1 分钟以上才能完成 我正在使用 django db connection cursor 执行查询 因为这不是我的默认数据库 30 秒后 我收到异常 查询超时已过期 我认为 30 秒是 d
  • ARC 中的系统对象委托是否需要设置为 nil?

    应用程序有时会因错误而崩溃objc object release 苹果开发者技术支持提到了这一点 请记住 您应该始终执行类似 tableView delegate 的操作 零 在你的 dealloc 方法中 即使你使用的是 ARC 出于兼容
  • 使用 Http/2 从 javascript 进行 api 调用

    我知道大多数浏览器支持 http 2 来加载页面 但这是否意味着我在使用 XmlHttpRequest 进行 api 调用时可以利用它 更具体地说 我的问题是 如果我使用 XmlHttpRequest 进行 2 次调用来获取数据 是否可以确
  • Flutter 中 GridView.count 与 GridView.builder 的区别

    有什么区别gridview builder and gridview count在颤振中 和其他任何人一样 builder GridView builder https api flutter dev flutter widgets Gri
  • React Select:传入自定义渲染使用的额外数据

    我正在使用反应选择 目前我正在从elasticsearch中获取数据并将其设置为 var new titles body hits hits forEach function obj looping through elasticsearc
  • Silverlight 4.0 的最佳 Jpeg 编码器

    我想将 Writablebitmap 转换为 Jpeg 流 看起来没有平台支持 而且我在网上看到了一堆开源编码器库 我想听听您的意见 就性能和性能而言 推荐哪个可靠性 我取得了很好的经验FJCore http code google com
  • 汇集估算数据集的 glmers

    问题 我有一个数据集 其中缺少一些预测变量值 我想要池glmer已应用于这些插补集的模型一起 我正在使用mice包来创建插补 我也使用过amelia and mi也没有成功 我想主要提取固定效应 使用pool mouse 包中的函数返回错误
  • 如何在本机反应中显示隐藏的导航栏

    我在本机反应中使用 NavigatorIOS 时遇到麻烦
  • 如何使用带有响应式 UI 的 Xamarin Android 将数据绑定到自定义 ListView

    我正在使用带有响应式 UI 的 Xamarin Android 而不是使用 Xamarin Forms 我有一个自定义 ListView 我已将其布局定义为 xaml 我不知道如何将此控件绑定到 ViewModel 中的 observabl
  • 哪些平台不在 type_info op== 中使用字符串比较?

    这是一个典型的实现type info operator if PLATFORM SUPPORTS UNIQUE TYPEINFO bool operator const type info rhs const return mangled
  • 在应用程序购买中验证

    我正在构建一个 iPhone 应用程序 该应用程序应该通过应用程序内购买处理订阅 当我在应用程序中从 Apple 收到收据时 我想将收据保存在我自己的服务器上 并且在我的服务器上我还想通过 Apple 服务器验证收据 与我的服务器建立连接非
  • 将整数变量传递给任务而不丢失整数类型

    我有一个我不拥有的任务 实际上是一个角色 但在这里使用任务是为了使示例更容易 它对变量进行一些操作 它假设变量是整数 我需要以某种方式向它传递一个变量并将其作为 int 传递 但我没有任何运气 这是我不拥有的任务的超级简化版本 frob y
  • 信息堆大小

    我可以从以下网站获得哪些信息performance memoryChrome 中的对象 这些数字意味着什么 它们是kb还是字符 我可以从这些数字中了解到什么 示例值performance memory MemoryInfo jsHeapSi
  • 为什么这个正则表达式在 Java 中不能按预期工作?

    简单的正则表达式问题 答案很可能是 Java 特定的 This is a comment in a file matches 这会返回 false 据我所知 意味着它总是意味着什么 没有什么特殊意义 所以我就翻译一下 作为 字符串开头的 哪
  • 如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)?

    你好 我一直在寻找一种方法play and recordLinux 最好是 Ubuntu 系统上的音频 我目前正在开发一个前端语音识别工具包 https www launchpad net cmusphinx train这将自动执行调整语音
  • ASP.NET MVC 4 / Web API - 为接受插入 Razor 渲染器:text/html

    我正在使用 ASP NET MVC 4 Web API 创建 RESTful Web 服务 对于 API 访问 我返回 JSON 但一旦一切正常工作 内容协商应该默认适用于 XML 和 JSON 由于我正在致力于实现真正的 RESTful
  • Apache Hadoop Yarn - 核心利用率不足

    无论我如何修改设置yarn site xml即使用以下所有选项 yarn scheduler minimum allocation vcores yarn nodemanager resource memory mb yarn nodema
  • SocketException:套接字已关闭

    我正在使用 Java Sockets 创建一个聊天应用程序 并且得到了SocketException socket closed关闭服务器时 我收到错误即使我从未尝试连接客户端 只是停止服务器将会出现此套接字关闭异常 我知道错误意味着什么
  • 如何检测Azure Add-AzureAccount登录是否失败或被取消?

    在我使用的 Azure PowerShell 脚本中Add AzureAccount将用户登录到 Azure 但是如何检测用户是否未成功完成登录以便我可以中止脚本 另一种方法是使用 try 和 catch 块 try Add AzureAc
  • Haskell opengl 纹理 GLFW

    我一直在尝试获取一些仅使用 texcoords 在正方形上显示纹理的脚本 如果可能的话 您可以编辑脚本 以便它可以正常工作 从那里我可以了解您是如何做到的 因为这就是我学习的方式 import Control Monad unless wh