2016-12-18 3 views
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

파일?

답변

0

사실, GHC가 단일 파일에서 수집 할 수 있었던 몇 가지 추가 정보가 필요했지만 정의 된 것이었지만 셰이더가 별도의 파일에 있었을 때 검색 할 수 없었습니다.

가 정의되어야했는데 어떻게 :

mainShader :: Shader os (ContextFormat RGBFloat ds) (PrimitiveArray p (B4 Float, B3 Float))() 
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 
관련 문제