Подскажите, как это правильно делается, уже задолбался. Везде скейл представлен скаляром, а мне надо независимо по трём осям. Это вообще возможно с кватернионами?
g-cont
А скейл кватернионов это вообще как? Ненормированный используешь?
Я тут пытаюсь переделать скиннинг с матриц на кватернионы, чтобы сэкономить униформы. Но у меня было масштабирование моделей по трём независимым осям.
Вот на этом месте я и споткнулся.
g-cont
Добавь вектор масштабирования?
-Eugene-
Тогда смысл в оптимизации? Корочи не получится скейл в кватернионы закодировать, я понял.
g-cont
Нууу, чудес не бывает. Девять степеней свободы меньше чем в девять параметров арифметически не закодируешь.
g-cont
Упакуй матрицы в текстуру и делай Vertex Texture Fetch, если на sm3.0 железе. На более новых картах есть константные буферы с неограниченным размером.
Wraith
так в том-то и дело, что железо старое, там нету даже UBO.
g-cont
Если следить за тем, чтобы w компонента кватерниона поворота была всегда положительна исходя из того (-xyz, w) соответствует (xyz, -w). То станет возможным в w компоненту закодить все твои скейлы жертвуя точностью (по аналогии с тем, как это делается при упаковке глубины в rgba текстуру)
const float T = 256.0; vec4 bitSh = vec4(1.0/( T*T*T), 1.0/( T*T), 1.0/T, 1.0); w = dot( scale / MAX_SCALE, bitSh);
В шейдере их декодировать
vec4 bitSh = vec4(T*T*T, T*T, T, 1.0); vec4 bitMsk = vec4( 0.0, 1.0/T, 1.0/T, 1.0/T); vec4 res = fract( w * bitSh); scale = ( res - res.xxyz * bitMsk) * MAX_SCALE;
и восстанавливать оригинальный w = sqrt(1 - dot(xyz, xyz))
XProger
если бы речь шла только об упаковке данных - я бы не создал эту тему. Но мне надо умножить кватернионы на родительские с учётом скейла по трём осям. А это физически невозможно. Только на матрицах.
ЗЫ. а про фокус с упаковкой я давно знаю и активно его юзаю.
Тема в архиве.