Я использую отложенное освещение, используя точечные источники света.Мой подход к визуализации источников света следующий:
Take an Unit Sphere[S]
Center=(0,0,0)
Radius=1 unit
Я выполняю рендеринг по 4 точечным источникам света с различным расположением и объемом влияния
Point Light 1
Position[P]==(-5f,0.4f,-6f)
Radius_Of_Influence[R]=1.5f
Point Light 2
Position[P]==(5f,0.4f,-6f)
Radius_Of_Influence[R]=2.5f
Point Light 3
Position[P]==(-5f,0.4f,6f)
Radius_Of_Influence[R]=0.8f
Point Light 4
Position[P]==(-5f,0.4f,6f)
Radius_Of_Influence[R]=0.7f
Теперь у меня есть один объект Matrix4f идля каждого источника света
for(PointLight light:lights)
{
translate(light.position(),modelMatrix);/*Translate the matrix with position*/
scale(light.radius(),modelMatrix);/*Scale the matrix with radius of influence*/
render_sphere();
}
Вот метод перевода матрицы
public void translate(float x,float y,float z)
{
translation.negate(); /*Undo the previous translation*/
Matrix4f.translate(translation.toVector(temp),modelMatrix,modelMatrix);
translation.set(x,y,z);/*translate with new values*/
Matrix4f.translate(translation.toVector(temp),modelMatrix,modelMatrix);
}
А вот метод масштабирования матрицы
public void scale(float x,float y,float z)
{
scale.set(1/scale.x,1/scale.y,1/scale.z);/*undo previous scaling*/
Matrix4f.scale(scale,modelMatrix,modelMatrix);
scale.set(x,y,z);/*apply new scale*/
Matrix4f.scale(scale,modelMatrix,modelMatrix);
}
Индивидуальнометоды работают отлично, но когда я их называю вместе, переводим и масштабируем Положение источника света увеличивается бесконечно
Вот матрица модели для каждого источника света в каждом кадре
2.899367 0.0 0.0 -5.0
0.0 2.899367 0.0 0.4
0.0 0.0 2.899367 -6.0
0.0 0.0 0.0 1.0
2.899367 0.0 0.0 23.993671
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -6.0
0.0 0.0 0.0 1.0
3.6717935 0.0 0.0 -5.0
0.0 3.6717935 0.0 0.39999998
0.0 0.0 3.6717935 22.993671
0.0 0.0 0.0 1.0
4.380832 0.0 0.0 31.717934
0.0 4.380832 0.0 0.39999998
0.0 0.0 4.380832 22.993671
0.0 0.0 0.0 1.0
2.899367 0.0 0.0 -12.090389
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -20.81465
0.0 0.0 0.0 1.0
4.380832 0.0 0.0 -1549.4392
0.0 4.380832 0.0 0.39999998
0.0 0.0 4.380832 -3280.6797
0.0 0.0 0.0 1.0
2.899367 0.0 0.0 -1593.2476
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -3324.488
0.0 0.0 0.0 1.0
2.899367 0.0 0.0 -1564.2539
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -3324.488
0.0 0.0 0.0 1.0
3.6717935 0.0 0.0 -1593.2476
0.0 3.6717935 0.0 0.39999998
0.0 0.0 3.6717935 -3295.4944
0.0 0.0 0.0 1.0
4.380832 0.0 0.0 -1556.5295
0.0 4.380832 0.0 0.39999998
0.0 0.0 4.380832 -3295.4944
0.0 0.0 0.0 1.0
2.899367 0.0 0.0 -1600.3379
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -3339.3027
0.0 0.0 0.0 1.0
Самый правый столбецявляется вектором перевода, и его значения быстро меняются.
Если я использую отдельные матрицы моделей для каждого источника света, он работает нормально, но я хочу сохранить память и выполнять операции только с одним объектом Matrix.
Идея состоит в том, чтобы отменить перевод и масштабирование из предыдущих кадров и применить новое преобразование
Любые идеи о том, как это сделать нане матрица?Вращение также должно быть сохранено