У меня есть небольшое открытое приложение GL, которое я пишу на Java с использованием JOGL.
Я бьюсь головой о стену, пытаясь найти ТЕКУЩИЙ способ применения преобразований
По существуя пытаюсь сделать так, чтобы два объекта были рядом друг с другом.В основном я создаю объекты (методы, которые вычисляют все треугольники - я знаю, что это работает, потому что оба объекта обнаруживаются, они просто перекрывают друг друга), затем на экране я помещаю их в VBO и вызываю drawElements.Моя проблема в том, что я не могу найти в Интернете никаких примеров или учебных пособий, в которых НЕ используются glTranslatef, glRotatef и glScalef, которые, как мне сообщили, устарели и являются частью фиксированного аспекта функции старого открытого GL.
РЕДАКТИРОВАТЬ: (предыдущий код удален)
Epic fail от моего имени.Когда он сказал свой код шейдера, я подумал, что он имел в виду файл .java, который загружает и компилирует шейдер.Меня просто поразило, что он имел в виду КОД ШЕЙДЕРА, который был в файле glsl.Теперь я вижу, где у него есть 3 переменные mat4, которые содержат rx, ry и rz.Странно то, что даже если я настрою масштаб и переведу матрицу, мои фигуры больше не будут появляться.Матрицы вращения устанавливаются так, как можно было бы предположить, и последняя строка выглядит так: «glPosition = rz * ry * rx * vPosition;»Я также попытался объявить матрицы перевода и масштабирования, а затем выполнить «= s * t * rz * ry * rx * vPosition», но без кубиков.
Вот текущий код шейдера:
attribute vec4 vPosition;
uniform vec3 theta;
uniform vec3 trans;
uniform vec3 scale;
void main()
{
// Compute the sines and cosines of each rotation
// about each axis
vec3 angles = radians (theta);
vec3 c = cos (angles);
vec3 s = sin (angles);
// rotation matricies
mat4 rx = mat4 (1.0, 0.0, 0.0, 0.0,
0.0, c.x, s.x, 0.0,
0.0, -s.x, c.x, 0.0,
0.0, 0.0, 0.0, 1.0);
mat4 ry = mat4 (c.y, 0.0, -s.y, 0.0,
0.0, 1.0, 0.0, 0.0,
s.y, 0.0, c.y, 0.0,
0.0, 0.0, 0.0, 1.0);
mat4 rz = mat4 (c.z, -s.z, 0.0, 0.0,
s.z, c.z, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
//mat4 t = mat4 (1.0, 0.0, 0.0, trans.x,
// 0.0, 1.0, 0.0, trans.y,
// 0.0, 0.0, 1.0, trans.z,
// 0.0, 0.0, 0.0, 1.0);
//mat4 s = mat4 (scale.x, 0.0, 0.0, 0.0,
// 0.0, scale.y, 0.0, 0.0,
// 0.0, 0.0, scale.z, 0.0,
// 0.0, 0.0, 0.0, 1.0);
gl_Position = rz * ry * rx * vPosition;
//gl_Position = s * t * rz * ry * rx * vPosition;
}
По сути, если я раскомментирую две нижние матрицы, но оставлю оператор glPosition тем же, ничего не появится.Также закомментированный оператор glPosition не работал (хотя я не удивлен, я не слишком хорош в умножении матриц).Я также попытался сделать только s * vPosition, просто чтобы попробовать и только масштабировать, но опять ничего не видно.