2013-08-03 6 views
4

Я бы хотел транспонировать матрицу в моем вершинном шейдере OpenGL ES 2.0, но, судя по всему, мой iPad 3 не поддерживает GLSL #version 120, который необходим для встроенной функции transpose(mat4).Передать mat4 в OpenGL ES 2.0 GLSL

Я знаю, что есть варианты, чтобы обойти это, как перенос матрицы на CPU, прежде чем передавать ее на графический чип, но это сделало бы мой шейдер намного проще, если бы я мог транспонировать его там.

Итак, есть ли опция transpose mat4 в шейдере на устройстве iOS 6?

Другое дело: Вопрос

What version of GLSL is used in the iPhone(s)?

говорит, что OpenGL ES 2.0 использует GLSL 1.20. Так почему же #version 120 не работает на iPad 3?

+0

Вы пробовали это без #version и с транспозицией? Я уверен, что он работает на стандартной справочной карте ES 2.0. –

+3

«* говорит, что OpenGL ES 2.0 использует GLSL 1.20 *« Нет, это не так. В нем говорится, что он «основан на» 1.20, а не на том, что он * использует * 1.20. –

+0

@ JustinMeiners yes Я пробовал это, не работает. 'transpose' не определено без' #version 120'. – cheeesus

ответ

10

Вы пробовали просто переставить его самостоятельно? Это проблема производительности? Если нет, я бы попробовал, потому что это то, над чем должен работать оптимизатор, и это займет две минуты. Что-то вроде:

highp mat4 transpose(in highp mat4 inMatrix) { 
    highp vec4 i0 = inMatrix[0]; 
    highp vec4 i1 = inMatrix[1]; 
    highp vec4 i2 = inMatrix[2]; 
    highp vec4 i3 = inMatrix[3]; 

    highp mat4 outMatrix = mat4(
       vec4(i0.x, i1.x, i2.x, i3.x), 
       vec4(i0.y, i1.y, i2.y, i3.y), 
       vec4(i0.z, i1.z, i2.z, i3.z), 
       vec4(i0.w, i1.w, i2.w, i3.w) 
       ); 

    return outMatrix; 
} 
+0

Собирайтесь делать это, если нет встроенной опции. – cheeesus

+1

Существует явно проблема с кодом. 'i3.y, i3.y' должно быть' i2.y, i3.y'. То же самое верно для z и w. – Mortennobel

3

как ответ на What version of GLSL is used in the iPhone(s)? правильно утверждает, IOS поддерживает OpenGL ES 2.0 с его компаньоном языка затенения: ESSL 1.0. ESSL 1.0 основан на, но не идентичен GLSL 1.20.

В ESSL 1.0 встроенная функция транспонирования отсутствует, поэтому вам нужно будет реализовать свои собственные.