2015-03-14 6 views
1

Попытка сделать по существу матричное умножение на вершины в шейдерах для преобразований, и это, ну, не имея этого.Как отправить однородную матрицу в шейдер в Haskell?

На данный момент у меня есть это:

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

setUniform является функцией в пакете GLUtil. Мне нужно преобразовать свой массив в Vec4 (Vec4), или есть другой способ?

Спасибо!

Edit:

я в конечном итоге делает это:

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: То, что я подразумеваю под этим, не работает, я получил его, чтобы установить его как единую переменную, но теперь мой объект исчез!

+0

Думаю, вы переносите матрицу. GL хочет большую колонку. – Dan

+0

Я определяю столбцы, когда получаю компоненты матрицы, не так ли? – Gentatsu

ответ

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. Инфиксная функция !*! является матричным умножением.

Это работает именно так, как я хотел, так что! Надеюсь, это поможет кому угодно!

0

Связи OpenGL Haskell (в настоящее время 2.11.1.0) не выставляют функцию для равномерных значений матрицы. Об этом сообщили несколько раз по ошибке трекера:

Это, как говорится, если у вас есть тип данных, который удовлетворяет экземпляр типа Storable, такие как M44 Float типа от ekmett/linear, вы можете просто использовать необработанный указатель для правильного вызова привязки OpenGLRaw. See an example here.

+0

Есть ли другой способ использования матриц преобразования в шейдерах? Насколько я понимаю, встроенные имена для них были устаревшими. – Gentatsu

 Смежные вопросы

  • Нет связанных вопросов^_^