0
하스켈 (저는 C++과 Java로 주로 경험이 많습니다.)에서 처음 보았습니다. 그래서 첫 번째 시도는 GPipe로 3D 프로그램을 작성하는 것입니다.하스켈과 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
파일?