Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在现代opengl 3.x/4.x中,矩阵模式切换的实际位置(或方式)是什么?_Opengl_View_Model_Projection - Fatal编程技术网

在现代opengl 3.x/4.x中,矩阵模式切换的实际位置(或方式)是什么?

在现代opengl 3.x/4.x中,矩阵模式切换的实际位置(或方式)是什么?,opengl,view,model,projection,Opengl,View,Model,Projection,我已经阅读了很多关于向量、缓冲区对象等的内容,并且回顾了许多实现旧的/新的opengl操作的示例应用程序。我的应用程序,包括对象加载、变换和顶点/片段着色器都可以工作,一般来说,我了解如何将各种类型的变量传递给着色器,以及如何绘制数组和元素数组,到目前为止一切都很好 但有一件事我不明白——最终的gl_位置矩阵使用我生成的矩阵,传递给顶点着色器,作为一些数学运算的结果(实际上我使用SDL、glew和glm的函数,如lookAt、translate、rotate等) 我所做的是 着色器 cpp 关键

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

但有一件事我不明白——最终的gl_位置矩阵使用我生成的矩阵,传递给顶点着色器,作为一些数学运算的结果(实际上我使用SDL、glew和glm的函数,如lookAt、translate、rotate等)

我所做的是 着色器

cpp

关键是,实际上,最终的矩阵,我可以,当然,通过任何组合生成。着色器使用有效的结果矩阵调用gl_位置,无论它是如何生成的。 现在,从投影到视图再到模型再到动画,我到底在哪里切换?当然,矩阵名称并不重要,透视、观察、平移和旋转中是否存在切换?我的意思是-如果堆栈实际上包含四个阶段,那么这些阶段中的每一个都可以被转换、旋转、缩放等。正如我现在所理解的那样,如果矩阵堆栈只有一个阶段,我所采取的行动将无关紧要

理论上,在3d场景中,如果我(将视图向左旋转45度,然后将模型向右旋转45度),或者如果我(将视图向右旋转45度,然后将模型向左旋转45度),我应该能够获得类似的效果

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


所以,总而言之,如果我想实现两个例程——A(obj_左转,me_右转)和B(obj_右转,me_左转),都是先旋转模型,然后是我自己(眼睛,相机),我如何指定特定旋转或变换应用于哪个矩阵模式?我应该使用glMatrixMode(适当的常数)在我想要的时候强制进入特定的阶段吗?到目前为止,我的代码中没有使用glMatrixMode。

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


为了在涉及高级内容时简化操作,您通常将转换分离为modelview和projection,以便您可以在视图空间中执行例如照明计算。但这不是一个转换,只是一个中间步骤。

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

为了在涉及高级内容时简化操作,您通常将转换分离为modelview和projection,以便您可以在视图空间中执行例如照明计算。但这不是一个转变,只是一个中间步骤

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