我读过很多关于矢量、缓冲物体等的内容,并审查了许多实施旧/新开放操作的示例应用。我的应用程序,包括物体装载、变换和顶部/分层遮光镜,总的来说,我理解如何将各种变数传递给遮光器,以及如何绘制阵列和元素阵列,迄今为止一切都很好。
但有一点我不明白——最后 gl_position 矩阵使用I 生成的矩阵,通过某些数学操作(实际上我使用SDL, glew and glm s 函数,如 LookAt, 翻译, 旋转等),传递到顶层阴影处。
what I do is shader
#version ...
uniform mvp..
main ..
{
gl_Position = mvp * ...;
}
cpp, cpp, cpp, cpp, cpp, cpp, cpp, cpp, cpp, cpp, cpp, cpp, 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);
The point is, that, actually, final matrix I can, of course, generate by any combination. Shader calls gl_Position with valid result matrix, no matter how it was generated. Now, where exactly do I switch from projection to view to model to anim? Of course matrix names doesn t matter, is there a switching somewhere inside perspective, lookAt, translate and rotate? I mean - if the stack contains actually four stages, each one of these stages can be translated, rotated, scaled, etc. As I understand it by now, actions I take would not matter, if there would be only one stage of matrix stack.
从理论上讲,在三维场景中,如果我(向左旋转45度,然后向右旋转45度),或者我(向右旋转45度,然后向左旋转45度),我就能取得类似的效果。
当我身体站在茶壶前面时,我可以将茶壶右转45, 绕着桌子走(翻译和旋转我自己)到桌子左转45, 从前面看它, 或者把它左转45, 从右边走45, 从前面看它。对世界其他国家来说,它会有所不同(我会看到茶壶后面的左边或右边房间墙 ), 但显然我会看到锅的前面。
因此,最后,如果我想执行两个常规程序- A( obj_ turn_ left, me_ turn_ right) 和 B( obj_ turn_ right, me_ turn_ left), 两种模式先旋转, 然后再旋转, 我( 眼睛, 相机) 。 我如何指定特定旋转或变换的矩阵模式适用于哪个矩阵模式? 我是否应该使用 glMatrix Mode( APPROPRIATE_ CONST) 强制进入特定阶段? glMatrixMode 至今还没有在我的代码中使用 。