如何将统一矩阵发送到Haskell中的着色器?

时间:2015-03-14 23:00:47

标签: opengl haskell shader vertices

尝试基本上对着色器中的顶点进行矩阵乘法以进行变换,这是呃,没有它。

目前,我有这个:

curMatrix <- get ((matrix $ Just $ Modelview 0)::StateVar(GLmatrix GLfloat))
       mc <- getMatrixComponents ColumnMajor curMatrix
setUniform p "uModelViewMatrix" mc 

setUniform是GLUtil包中的一个函数。我需要将我的数组转换为Vec4(Vec4),还是有另一种方式?

谢谢!

编辑:

我最终这样做了:

getMat :: [GLfloat] -> [V4 GLfloat]
getMat (a11:a12:a13:a14: 
        a21:a22:a23:a24:
        a31:a32:a33:a34:
        a41:a42:a43:a44:_) = [(V4 a11 a12 a13 a14),
                              (V4 a21 a22 a23 a24),
                              (V4 a31 a32 a33 a34),
                              (V4 a41 a42 a43 a44)]

呃,好吧这似乎没有用!

编辑2:我的意思是它不起作用,我把它设置为一个统一变量,但现在我的对象已经消失了!

2 个答案:

答案 0 :(得分:0)

Haskell的OpenGL绑定(目前为2.11.1.0)不公开统一矩阵值的函数。已在bug跟踪器上多次报告此事:

话虽如此,如果您的数据类型满足Storable类型的实例,例如来自ekmett/linearM44 Float类型,您只需使用原始指针即可OpenGLRaw绑定调用。 See an example here

答案 1 :(得分:0)

搞定了!它不起作用的主要原因是因为我也没有使用投影矩阵。

请不要因为我的坏/混乱的变量名称而用棍棒打败我。

    mvMatrix <- get ((matrix $ Just $ Modelview 0)::StateVar(GLmatrix GLfloat))
    pMatrix <- get ((matrix $ Just Projection)::StateVar(GLmatrix GLfloat))
    mv <- getMatrixComponents ColumnMajor mvMatrix
    pm <-   getMatrixComponents ColumnMajor pMatrix
    let mvm = getMat mv
    let pM = getMat pm 
    let mvmp = mvm !*! pM
    setUniform p "uModelViewMatrix" mvmp

我的getMat函数如下:

getMat :: [GLfloat] -> V4 (V4 GLfloat)
getMat (a11:a12:a13:a14: 
            a21:a22:a23:a24:
            a31:a32:a33:a34:
            a41:a42:a43:a44:_) = V4 (V4 a11 a12 a13 a14)
             (V4 a21 a22 a23 a24)
             (V4 a31 a32 a33 a34)
             (V4 a41 a42 a43 a44)

我正在使用Linear包。 !*!中缀函数是矩阵乘法。

这完全符合我的要求,所以耶!希望它可以帮助其他人!