OpenGL -- GL_PROJECTION跟GL_MODELVIEW区别

本文深入探讨OpenGL及其关键函数GL_PROJECTION、GL_MODELVIEW、GL_TEXTURE的用途,解释了它们在图形编程中分别对应于投影、模型视景和纹理操作的概念,并通过实例展示了这些概念的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GL_PROJECTION 跟 GL_MODELVIEW 均是 glMatrixMode() 函数的参数,该函数的作用便是对接下来所要做什么进行声明,比如在进行下一步之前告诉计算机我要对什么东西进行操作。

参数GL_PROJECTION 是投影的意思,即要对投影相关进行操作,将一个物体映射到一个平面上,就好像平时照相将三维的物体映射成二维。

而如果参数是GL_MODELVIEW,它是对模型视景的操作,接下来的语句描绘了一个以模型为基础的适应。

最后还有GL_TEXTURE, 它是对纹理相关进行操作。

总的来说,GL_PROJECTION是对投影矩阵操作,GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。

### OpenGL 中 `GL_PROJECTION_MATRIX` 的使用方法及作用 在 OpenGL 中,投影矩阵 (`GL_PROJECTION_MATRIX`) 是用于定义如何将三维场景映射到二维屏幕上的重要工具。通过设置不同的投影矩阵,可以实现正交投影和透视投影两种主要类型的投影。 #### 设置投影矩阵的方式 为了指定当前使用的矩阵堆栈,在调用任何修改矩阵的操作之前,必须先调用 `glMatrixMode(GLenum mode)` 函数来选择要操作的矩阵模式[^1]。对于投影矩阵而言,应传递参数 `GL_PROJECTION` 给此函数: ```c++ glMatrixMode(GL_PROJECTION); ``` 接着可以通过诸如 `glLoadIdentity()` 来重置当前选定的矩阵为单位矩阵;之后再应用特定于所需投影类型的转换(比如缩放、平移或旋转)。完成这些设定后记得切换回模型视图矩阵(`GL_MODELVIEW`)以便继续处理物体的位置和其他属性: ```c++ // 切换至投影矩阵并初始化它 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 应用所需的投影变换... // 对于正交投影可采用下面的方法 glOrtho(left, right, bottom, top, nearVal, farVal); // 或者对于透视投影则可以用这个方法 gluPerspective(fovY, aspectRatio, zNear, zFar); // 返回到默认的状态即模型视图矩阵 glMatrixMode(GL_MODELVIEW); ``` #### 正交与透视投影的区别 构建正交投影矩阵相对简单得多,因为它只是线性地映射世界坐标系中的对象到裁剪空间内而不考虑距离因素[^3]。这意味着远处的对象看起来不会比近处的小——这非常适合绘制不需要深度感知的应用场合如CAD图纸或是UI界面设计。 相比之下,透视投影模拟了人类视觉系统的特性,使得远离观察者的物体显得更小,并且随着它们离得越来越远逐渐消失在一个称为“灭点”的位置上。这种效果更加逼真但也稍微复杂一些因为涉及到额外的角度计算以及可能存在的畸变修正等问题。 #### 示例代码展示 这里给出一段简单的C++/OpenGL代码片段作为例子说明如何创建一个基本的透视投影矩阵: ```cpp #include <GL/glut.h> void initProjection() { // 初始化投影矩阵 glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 创建一个45度视野角、宽高比例为窗口宽度除以高度, // 近平面设为0.1f, 远平面设为100.f 的透视投影矩阵 gluPerspective(45., (GLfloat)windowWidth / windowHeight, 0.1f, 100.f); } int main(int argc, char **argv){ glutInit(&argc, argv); ... } ``` 这段代码展示了怎样利用标准库函数 `gluPerspective` 构建一个适合大多数情况下的透视视角配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值