Войти
ПрограммированиеФорумГрафика

Освещение скелетно-анимированной модели (glsl)

#0
7:17, 4 сен. 2019

Не могу понять как правильно в вершинном шейдере сделать освещение анимированной модели.
Есть стандартный шейдер, взятый из примеров руководства по OpenGL:

void main() {

  mat4 boneTransform = ubo.bones[inBoneIDs[0]] * inBoneWeights[0];
  boneTransform     += ubo.bones[inBoneIDs[1]] * inBoneWeights[1];
  boneTransform     += ubo.bones[inBoneIDs[2]] * inBoneWeights[2];
  boneTransform     += ubo.bones[inBoneIDs[3]] * inBoneWeights[3];  

  gl_Position = ubo.projection * ubo.view *  ubo.model * boneTransform * vec4(inPosition, 1.0);
  fragColor = inColor;

  fragTexCoord = uv;

  vec4 pos = ubo.model * vec4(inPosition, 1.0);

  outNormal = mat3(inverse(transpose(ubo.model * boneTransform))) * inNormal;

  outLightVec = ubo.lightPos.xyz - pos.xyz;
  outViewVec  = ubo.viewPos.xyz - pos.xyz;   
}

Ну как бы все понятно и просто, но как только модель анимируется - свет ложится неправильно (если анимация к моели не применяется - то все ок). Я подумал, что проблема в вычислении pos, так как там не учитываются изменения кординат вершин при анимации изменил ее так:

vec4 pos = ubo.model * boneTransform * vec4(inPosition, 1.0);
но свет все равно ложится неправильно, только уже по другому. С нормалями все хорошо, они верные. Формат модели fbx, если это вдруг важно.
Интересует, где может быть ошибка.


#1
(Правка: 7:47) 7:44, 4 сен. 2019

MikeNew
> Интересует, где может быть ошибка.
в коде. отлаживать не пробовал? учись отлаживать выводом цвета все участвующие в вычислениях величины. например, позицию можно выводить цветом так: color.rgb = fract(pos.xyz * 0.1f);, нормали просто так color.rgb = normal.xyz * 0.5f + vec3(0.5f) и так далее. выводишь цветом все трансформированные и исходные значения, ищешь, где величина не совпадает с тем, что ты ожидаешь. подобные треды "где у меня ошибка?" вообще должны перестать существовать, потому что если у тебя возникает такой вопрос, это значит, что ты либо неправильно отлаживаешь код, либо не понимаешь, как он должен работать. соответственно и тред должн быть назван либо : "как преобразуется нормаль при скиннинге", либо "как отлаживать float-атрибуты в вершинном шейдере".

то, что ты сейчас спрашиваешь, примерно равносильно вопросу "как мне доехать до хладокомбината на моём сегвее?". вопрос должен быть либо "как пользоваться картой для навигации?" либо "как пользоваться сегвеем?"

#2
(Правка: 18:06) 7:58, 4 сен. 2019

MikeNew
У тебя отсутствует трансформация,нормали к вершинам матрицей кости, не забудь использовать mat3, нуже только поворот.
Проглядел нормали трансформируются матрицей кости.

#3
8:32, 4 сен. 2019

Suslik
> учись отлаживать выводом цвета все участвующие в вычислениях величины.

а как же отладчики?

#4
11:13, 4 сен. 2019

Могут быть неправильные нормали. Проверь в каком-нибудь вьювере, что моделька нормальная с нормалями и правильными нормалями.

И второе. Возьми какой-нибудь шейдер едитор типа  RenderMonkey.
http://3d-orange.com.ua/specular-lighting-heat-haze-using-glsl-in-rendermonkey/

И отлаживай в нём. "Детские" болезни своего шейдера отфильтруешь сразу.

#5
15:10, 4 сен. 2019
моделька нормальная с нормалями и правильными нормалями. xD xD xD
#6
16:53, 4 сен. 2019

Что есть outViewVec и как он используется в формуле освещения?

#7
(Правка: 8:05) 8:04, 5 сен. 2019

Частично проблема решилась - оказалась что fbx-модель была импортирована неправильно, масштаб должен быть 1 по все осям, а смещение - нулевым. Правда, я все равно не понял почему не работала корректировка позиции координат фрагмента при умножении на трансоформирующую матрицу кости.
Теперь возникла следующая проблема - карта теней на анимированую модель ложится неправильно, если ее не анимировать - ложится правильно. Но это вопрос отдельной темы.

Deamon
> Что есть outViewVec и как он используется в формуле освещения?
Вектор разности позиции камеры и позиции фрагмента, используется при расчете освещения по Фонгу, здесь все есть:
https://habr.com/ru/post/353054/

KKH
> Могут быть неправильные нормали. Проверь в каком-нибудь вьювере, что моделька
> нормальная с нормалями и правильными нормалями.
Я нормали прямо в своей программе смотрю, все нормально с ними было, как и предполагалось. Проблема в том, что я не до конца осознаю как работает матрица транформации костей.

Suslik
> то, что ты сейчас спрашиваешь, примерно равносильно вопросу "как мне доехать до
> хладокомбината на моём сегвее?". вопрос должен быть либо "как пользоваться
> картой для навигации?" либо "как пользоваться сегвеем?"
Отругал меня, как обычно. :)

ПрограммированиеФорумГрафика