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

ファイル?

答えて

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 
関連する問題