Я много читал о векторах, объектах буфера и т. Д., И рассмотрел большую часть примера приложения, реализующего старые/новые операции opengl. Мое приложение, включая загрузку объектов, преобразования и вершинные/фрагментарные шейдеры, в общем, я понимаю, как передавать различные типы переменных в шейдеры, а также рисовать массивы и массивы элементов, все идет хорошо.На самом деле, где (или каким образом) переключение матричных режимов происходит в современном opengl 3.x/4.x?
Но есть одна вещь, которую я не понимаю - последняя матрица gl_Position использовала матрицу, которую я сгенерировала, передала вершинному шейдеру, как некоторый результат некоторых математических операций (на самом деле я использую функции SDL, glew и glm, такие как lookAt, translate, rotate и т.д.).
что я делаю шейдер
#version ...
uniform mvp..
main ..
{
gl_Position = mvp * ...;
}
каст
load_object_vertices_indexes_etc;
install_shaders;
bind_buffers;
buffer_data;
enable_vertex_array_elements_etc;
mat4 aaa_proj = perspective(persp_params);
mat4 bbb_view = lookAt(look_params);
mat4 ccc_model = translate(translate_params);
mat4 ddd_anim = rotate(rotate_params);
/* then I do matrix multiply */
mat4 some_final = ..proj * ...view * ..model * anim;
glUniformMatrix4fv(location_in_shader, 1, GL_FALSE, ..val_pointer_of_some_final)
glClear(appropriate_bitfield);
glDraw...(spec);
Дело в том, что, собственно, конечная матрица я могу, конечно, генерировать любой комбинации. Шейдер вызывает gl_Position с действительной матрицей результатов, независимо от того, как она была сгенерирована. Теперь, где именно я переключаюсь от проекции к представлению модели к анимации? Конечно, имена матриц не имеют значения, есть ли переключение где-то внутри перспективы, lookAt, переводить и вращать? Я имею в виду, если в стеке есть фактически четыре этапа, каждый из этих этапов может быть переведен, повернут, масштабирован и т. Д. Как я понимаю, к настоящему времени действия, которые я принимаю, не имеют значения, если будет только один этап матричного стека ,
Теоретически, внутри 3d-сцены я должен иметь возможность получить аналогичный эффект, если я (повернуте вид на 45 градусов влево, а затем поверните модель на 45 градусов вправо), или если я (поверните вид 45 вправо, а затем поверните модель 45 degress оставил).
Когда я стою физически перед чайником, я могу повернуть его направо 45 и обойти вокруг стола (перевести и повернуть себя) налево 45, чтобы увидеть его спереди, или поверните его налево 45 и пройдите 45 вправо чтобы увидеть его спереди. Он будет отличаться для остального мира (я увижу левую или правую стену комнаты за чайником), но, очевидно, я прекращу видеть переднюю часть горшка.
Итак, если я хотел бы реализовать две процедуры - A (obj_turn_left, me_turn_right) и B (obj_turn_right, me_turn_left), как первая вращающаяся модель, так и я (глаз, камера) позже, как указать к какому режиму матрицы относится конкретное вращение или преобразование? Должен ли я использовать glMatrixMode (APPROPRIATE_CONST) для принудительного перехода на конкретный этап, когда я хочу? glMatrixMode пока не используется в моем коде.