2014-01-28 6 views
1

Как перенести такое вычисление:AGAL: m44 вместо Matrix3D.append()

var a : Matrix3D = ... 
var b : Matrix3D = ... 
a.append(b); 

в шейдер?

Мой текущий подход:

setProgramConstantsFromMatrix(VERTEX, 0, a, true); 
setProgramConstantsFromMatrix(VERTEX, 4, b, true); 


"mov vt0, vc0\n" + 
"mov vt1, vc1\n" + 
"mov vt2, vc2\n" + 
"mov vt3, vc3\n" + 
"m44 vt4, vc4, vt0\n" 

производят неправильные результаты в VT4. Что я делаю не так?

+0

Хорошо, когда вы используете a.append (b); вы получаете новую матрицу. И когда вы используете m44, вы получаете вектор. В качестве источника должен быть вектор. http://help.adobe.com/en_US/as3/dev/WSd6a006f2eb1dc31e-310b95831324724ec56-8000.html – nikitablack

+0

Действительно, похоже, что Volgogradetzzz прав. Примерно на треть пути вниз по этой странице ... http://www.adobe.com/devnet/flashplayer/articles/what-is-agal.html есть диаграмма. Проверьте описание m44, и он говорит, что он принимает матрицу и 4-компонентный вектор (компонент - это x, y, z или w). Он не может умножить две матрицы. – moosefetcher

ответ

0

В шейдере вам не нужно назначать vt1, 2 и 3. Шейдер будет «знать», он посылает матрицу и автоматически загружает следующие 3 регистра (всего 4 регистра) с требуемыми данными. Их загрузка может привести к непредсказуемым результатам.
Также обратите внимание, что порядок, используемый для умножения matrix3D, имеет значение. В AS3 существует также метод prepend, который ставит параметр matrix3D в правой части умножения. Метод append помещает параметр matrix3D в левую часть умножения. Тогда вам может потребоваться изменить порядок, в котором вы применяете m44. то есть; вы можете установить vt1 в b, а затем умножить (m44) на a.

+0

Причина (вероятно) для перемещения матрицы A в регистры tmp заключается в том, что AGAL не допускает умножения двух констант. – Varnius

+0

Я знаю. Я говорил о другой проблеме; должен ли он передавать регистры VOLVO 3 vc в регистры vt. Размышляя об этом, я не уверен. Но все равно стоит обратить вспять порядок, в котором он применяет умножение. – moosefetcher

+0

Пробовал оба: оставив только «mov vt0, vc0» и обмен vc4 и vt0: не помог. – Slav