如何使用OpenGL和Haskell绘制三角形

赌注

我正在从http://www.arcsynthesis.org/gltut阅读教程我写测试haskell程序。我想在窗口中心看到带有插值颜色的三角形,但是在窗口上看到一种颜色。

module Shaders where

import Graphics.UI.GLUT
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable()
import Foreign.C.Types()
import qualified Data.ByteString as BS
import System.IO
import Control.Monad

data State = State 
    {
        vertexBuffer :: BufferObject,
        gpuProgram :: Program
    }

triangleVertexes :: [GLfloat]
triangleVertexes = [
     0.0,  0.5,   0.0, 1.0,
     0.5, -0.366, 0.0, 1.0,
    -0.5, -0.366, 0.0, 1.0,
     1.0,  0.0,   0.0, 1.0,
     0.0,  1.0,   0.0, 1.0,
     0.0,  0.0,   1.0, 1.0
    ]

main :: IO ()
main = do
   (progName, args) <- getArgsAndInitialize
   initialDisplayMode $= [ DoubleBuffered, RGBAMode, WithAlphaComponent, WithDepthBuffer ]
   _ <- createWindow progName
   state <- initializeState
   displayCallback $= display state
   reshapeCallback $= Just (reshape state)
   mainLoop

fragmentShaderFilePath :: FilePath
fragmentShaderFilePath = "shader.frag"

vertexShaderFilePath :: FilePath
vertexShaderFilePath = "shader.vert"

createVertexBuffer :: [GLfloat] -> IO BufferObject
createVertexBuffer vertexes = do
    bufferObject <- genObjectName
    bindBuffer ArrayBuffer $= Just bufferObject
    withArrayLen vertexes $ \count arr ->
        bufferData ArrayBuffer $= (fromIntegral count, arr, StaticDraw)
    vertexAttribArray (AttribLocation 0) $= Enabled
    vertexAttribArray (AttribLocation 1) $= Enabled
    vertexAttribPointer (AttribLocation 0) $= (ToFloat, VertexArrayDescriptor vertexNumComponents Float 0 nullPtr)
    vertexAttribPointer (AttribLocation 1) $= (ToFloat, VertexArrayDescriptor colorNumComponents Float 0 (plusPtr nullPtr 48))
    return bufferObject

vertexNumComponents :: NumComponents
vertexNumComponents = 4

colorNumComponents :: NumComponents
colorNumComponents = 4

initializeState :: IO State
initializeState = do
    bufferObject <- createVertexBuffer triangleVertexes
    program <- initGPUProgram
    return $ State 
        {
            vertexBuffer = bufferObject,
            gpuProgram = program
        }

loadShader :: ShaderType -> FilePath -> IO Shader
loadShader t path = do
    shader <- createShader t
    source <- BS.readFile path
    shaderSourceBS shader $= source
    compileShader shader
    status <- get (compileStatus shader)
    unless status $ hPutStrLn stdout . (("message" ++ " log: ") ++) =<< get (shaderInfoLog shader)
    return shader

initGPUProgram :: IO Program
initGPUProgram = do
    vertexShader <- loadShader VertexShader vertexShaderFilePath
    fragmentShader <- loadShader FragmentShader fragmentShaderFilePath
    let shaders = [vertexShader, fragmentShader]
    program <- createProgram
    attachShader program vertexShader
    attachShader program fragmentShader
    linkProgram program
    mapM_ (detachShader program) shaders
    return program

display :: State -> DisplayCallback
display state = do
    clearColor $= Color4 1.0 0.0 1.0 1.0
    clear [ ColorBuffer ]
    bindBuffer ArrayBuffer $= Just (vertexBuffer state)
    vertexAttribArray (AttribLocation 0) $= Enabled
    vertexAttribArray (AttribLocation 1) $= Enabled
    vertexAttribPointer (AttribLocation 0) $= (ToFloat, VertexArrayDescriptor vertexNumComponents Float 0 nullPtr)
    vertexAttribPointer (AttribLocation 1) $= (ToFloat, VertexArrayDescriptor colorNumComponents Float 0 (plusPtr nullPtr 48))
    drawArrays Triangles 0 3
    vertexAttribArray (AttribLocation 0) $= Disabled
    vertexAttribArray (AttribLocation 1) $= Disabled
    swapBuffers
    checkError "display"

reshape :: State -> ReshapeCallback
reshape state size = do
     viewport $= (Position 0 0, size)

checkError :: String -> IO ()
checkError functionName = get errors >>= mapM_ reportError
    where reportError e = 
             hPutStrLn stdout (showError e ++ " detected in " ++ functionName)
         showError (Error category message) =
            "GL error " ++ show category ++ " (" ++ message ++ ")"

-- shader.frag
#version 330

smooth in vec4 theColor;

out vec4 outputColor;

void main()
{
    outputColor = theColor;
}

-- shader.vert
#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main()
{
    gl_Position = position + vec4(0.5, 0.5, 0.0, 1.0);
    theColor = color;
}

1)在教程作者中使用glUseProgram函数。在Haskell绑定到OpenGL时,缺少此功能。glUseProgram的模拟形式是什么?

2)我做错了什么?

赌注

glUseProgram确实存在问题。Haskell模拟是currentProgram。另一个代码错误:

withArrayLen vertexes $ \count arr ->
    bufferData ArrayBuffer $= (fromIntegral count, arr, StaticDraw)

必须是

withArrayLen vertexes $ \count arr ->
    bufferData ArrayBuffer $= (fromIntegral count * 4, arr, StaticDraw)

工作正常!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用OpenGL和Haskell绘制三角形

来自分类Dev

使用 OpenGL 绘制基本三角形

来自分类Dev

如何使用 QT 绘制三角形和菱形

来自分类Dev

OpenGL拒绝绘制三角形

来自分类Dev

OpenGL三角形未绘制

来自分类Dev

OpenGL绘制三角形

来自分类Dev

无法在OpenGL中绘制三角形

来自分类Dev

如何使用现代OpenGL和Python旋转三角形

来自分类Dev

Qt和OpenGL,如果我使用属性,则绘制一个三角形

来自分类Dev

如何绘制三角形?

来自分类Dev

opengl和GLFW3简单三角形绘制,看不到三角形

来自分类Dev

如何在 OpenGL C++ 中绘制多个三角形?

来自分类Dev

使用for循环绘制三角形

来自分类Dev

使用双数组绘制三角形

来自分类Dev

使用递归绘制嵌套的三角形

来自分类Dev

使用Java绘制三角形

来自分类Dev

使用线条填充绘制的三角形

来自分类Dev

如何使用OpenGL ES绘制具有不同变换矩阵的多个三角形?

来自分类Dev

无法在Android上使用OpenGL ES 2.0绘制三角形

来自分类Dev

OpenGL:使用简并三角形绘制线

来自分类Dev

使用OpenGL ES在现实世界中绘制三角形

来自分类Dev

如何用QPainter绘制和填充三角形?

来自分类Dev

如何在R中导入和绘制三角形网格?

来自分类Dev

如何在Java中旋转,缩进和绘制三角形以打印梯形?

来自分类Dev

使用不同的 VAO 和 VBO 绘制多个三角形

来自分类Dev

如何使用三角形顶点坐标(每个三角形有 9 个数字)在 matplotlib 中绘制 3d 三角形?

来自分类Dev

如何在序言中使用递归绘制星形三角形?

来自分类Dev

如何使用SVG以编程方式绘制带有圆角的三角形?

来自分类Dev

如何使用python绘制直角三角形

Related 相关文章

热门标签

归档