0
私はHaskellの新機能です(私はC++とJavaでよく経験しています)ので、私の最初の試みはGPipeで3Dプログラムを書くことです。HaskellとGPipeで別々のファイルにシェーダを定義する方法
module Shaders(mainShader) where
import Graphics.GPipe
import Control.Monad (unless)
mainShader :: Shader
mainShader = do
primitiveStream <- toPrimitiveStream id
let tPrimStr = fmap (\(pos,col) -> (pos - V4 1 0 0 0, col - V3 1 0 0)) primitiveStream
fragmentStream <- rasterize (const (FrontAndBack, ViewPort (V2 0 0) (V2 500 500), DepthRange 0 1)) tPrimStr
drawContextColor (const (ContextColorOption NoBlending (V3 True True True))) fragmentStream
:私はこのような別のファイルにシェーダを入れたいのですが、しかし
{-# LANGUAGE ScopedTypeVariables, PackageImports, TypeFamilies #-}
module Drawy (drawyRun) where
import Graphics.GPipe
import qualified "GPipe-GLFW" Graphics.GPipe.Context.GLFW as GLFW
import Control.Monad (unless)
mainShader = do
primitiveStream <- toPrimitiveStream id
let tPrimStr = fmap (\(pos,col) -> (pos - V4 1 0 0 0, col - V3 1 0 0)) primitiveStream
fragmentStream <- rasterize (const (FrontAndBack, ViewPort (V2 0 0) (V2 500 500), DepthRange 0 1)) tPrimStr
drawContextColor (const (ContextColorOption NoBlending (V3 True True True))) fragmentStream
drawyRun :: IO()
drawyRun = do
runContextT GLFW.newContext (ContextFormatColor RGB8) $ do
vertexBuffer :: Buffer os (B4 Float, B3 Float) <- newBuffer 3
writeBuffer vertexBuffer 0 [ (V4 (-1) 1 0 1, V3 1 0 0)
, (V4 0 (-1) 0 1, V3 0 1 0)
, (V4 1 1 0 1, V3 0 0 1)
]
shader <- compileShader mainShader
loop vertexBuffer shader 0.0
loop vertexBuffer shader i = do
writeBuffer vertexBuffer 0 [ (V4 (-1) 1 0 1, V3 1 0 1)
, (V4 0 (-1) 0 1, V3 0 1 0)
, (V4 1 0 0 1, V3 0 0 1)
]
render $ do
clearContextColor (V3 0.0 0.0 0.0)
vertexArray <- newVertexArray vertexBuffer
let primitiveArray = toPrimitiveArray TriangleList vertexArray
shader primitiveArray
swapContextBuffers
closeRequested <- GLFW.windowShouldClose
unless closeRequested $
loop vertexBuffer shader (i+0.1)
:
現在、私は、「メイン」プログラムと同じファイルで定義されたシェーダを持っています
しかし、その後、コンパイラは文句:
別々にシェーダーを定義するための正しい方法を何Shaders.hs:6:15: error: • Expecting four more arguments to ‘Shader’ Expected a type, but ‘Shader’ has kind ‘* -> * -> * -> * -> *’ • In the type signature: mainShader :: Shader
ファイル?