实际上,在现代opengl 3.x/4.x中,矩阵模式切换发生的位置(或方式)



我已经阅读了很多关于向量、缓冲区对象等的内容,并回顾了许多实现旧/新 opengl 操作的示例应用程序。我的应用程序,包括对象加载,转换和顶点/片段着色器工作,总的来说,我了解如何将各种类型的变量传递给着色器,以及如何绘制数组和元素数组,到目前为止一切顺利。

但是有一件事我不明白 - 最终gl_Position矩阵使用我生成的矩阵,传递给顶点着色器,作为一些数学运算的一些结果(实际上我使用 SDL、glew 和 glm 的函数,如 lookAt、平移、旋转等)。

我所做的是着色

#version ...
uniform mvp..
main ..
{
   gl_Position = mvp * ...;
}

.cpp

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);

关键是,实际上,我当然可以通过任何组合生成最终矩阵。Shader 使用有效的结果矩阵调用gl_Position,无论它是如何生成的。现在,我究竟在哪里从投影切换到视图,再到模型到动画?当然矩阵名称并不重要,透视、查看、平移和旋转内部是否有切换?我的意思是 - 如果堆栈实际上包含四个阶段,则每个阶段都可以平移、旋转、缩放等。据我了解,如果矩阵堆栈只有一个阶段,我采取的行动将无关紧要。

从理论上讲,在3D场景中,如果I(将视图向左旋转45度,然后向右旋转模型45

度),或者如果我(将视图向右旋转45,然后将模型45向左旋转),我应该能够获得类似的效果。

当我站在茶壶前时,我可以向右转 45 并绕着桌子走动(平移和旋转自己)到左 45 从前面看它 - 或者向左转 45 向右走 45 从前面看它。世界其他地方的情况会有所不同(我会在茶壶后面看到左边或右边的房间墙),但显然我会结束看到壶的前面。

因此,总而言之,如果我想实现两个例程 - A(obj_turn_left,me_turn_right)和B(obj_turn_right,me_turn_left),首先旋转模型,然后是我自己(眼睛,相机),我如何指定特定旋转或转换适用于哪种矩阵模式?我应该使用 glMatrixMode(APPROPRIATE_CONST) 来强制进入特定的阶段吗?到目前为止,glMatrixMode还没有在我的代码中使用。

根本没有切换发生。您将整个转换链乘以为一个复合矩阵。

为了在高级内容方面更容易,您通常会将转换分为模型视图和投影,以便您可以在视图空间中执行例如照明计算。但这不是一个开关,而只是一个中间步骤。

最新更新