《OpenGL编程指南》 笔记五 视口变换、剪切与反馈

本文详细介绍了OpenGL中的视图变换,包括观察视图、相机模型和视锥体剪切,强调了齐次坐标的使用。讨论了用户变换,如矩阵乘法、齐次坐标和线性变换,以及OpenGL中的视口设置和深度范围调整。还涵盖了用户剪切和transform feedback的概念,包括transform feedback对象、缓存、配置以及启动和停止的控制,以一个粒子系统的例子进行了说明。
摘要由CSDN通过智能技术生成

第五章 视口变换、剪切与反馈

5.1 观察视图

  • 将三维空间的模型投影到二维的关键方法,就是齐次坐标的应用、矩阵乘法的线性变换方法,以及视口映射

5.1.1 视图模型

5.1.2 相机模型

  • 视图变换的操作可以类比为使用照相机拍摄照片的过程:

    1. 将相机移动到准备拍摄的位置,将它对准某个方向(视图变换,view transform)
    2. 将准备拍摄的对象移动到场景中必要的位置上(模型变换,model transform)
    3. 设置相机的焦距,或者调整缩放比例(投影变换,projection transform)
    4. 拍摄照片(应用变换结果)
    5. 对结果图像进行拉伸或挤压,将它变换到需要的图片大小(视口变换,viewport transform)
  • 值得注意的是,可以认为上边的第1步和第2步做的是同一件事情,只不过方向相反而已。因此,通常将这两个步骤合并为一个模型-视图变换(model-view transform)。然而,这一过程将总包含多级平移、旋转和缩放操作。而这一合并过程中的主要特征,就是构建一个独立的、统一的空间系统,将场景中所有的物体都变换到视图空间,或者人眼空间当中

  • 我们传递给OpenGL的坐标因该是已经完成模型视图变换和投影变换的。我们还需要告诉OpenGL如何完成视口变换

  • OpenGL整个处理过程中用到的坐标系统:
    在这里插入图片描述

  • 上图所示的过程中,最后一步是设置OpenGL的视口和深度范围。OpenGL得到的最终坐标是归一化之后的齐次坐标,并且将进行剪切和光栅化的操作。也就是说,最后要绘制的坐标总是在[-1.0, 1.0]的范围内,知道OpenGL对它们进行缩放以匹配视口大小为止

  • 上图中用户变换的解释:
    在这里插入图片描述

视锥体
  • 平截锥体 frustum
视锥体的剪切
  • 应用程序需要告诉OpenGL当前视锥体的参数值,而着色器将负责变换的应用过程;OpenGL将通过这些参数来完成剪切的操作;着色器中也可以使用用户自定义的平面来进行剪切

5.1.3 正交视图模型

5.2 用户变换

  • 渲染管线各阶段中,对于三维坐标的变换情况:
    在这里插入图片描述

5.2.1 矩阵乘法的回顾

  • 矩阵乘法的定义:(一个4x4的矩阵与一个4维向量的乘法,得到一个新的4维向量)
    在这里插入图片描述
  • 对于视图模型来说,我们需要对一个向量进行多次变换,这一过程可以通过矩阵A和矩阵B的乘法来表达:
    在这里插入图片描述
  • 矩阵的乘法不可交换,即AB!=BA
  • 矩阵的乘法符合结合律,即C(BA)=(CB)A=CBA

5.2.2 齐次坐标

  • 将三维的笛卡尔坐标转换为四维的齐次坐标,有两个主要的好处:
    1. 可以进一步完成透视变换
    2. 可以使用线性变换来实现模型的平移
      也就是说,如果使用四维坐标系统,就可以通过矩阵乘法完成所有的旋转、平移、缩放和投影变换操作
      投影变换是透视效果实现的关键步骤,也是我们必须在着色器中实现的一个步骤
进阶:什么是齐次坐标
  • 三维数据可以通过3维向量与3x3矩阵的乘法操作,来完成缩放和旋转的线性变换。但是对3维笛卡尔坐标的平移是无法通过3x3矩阵的乘法操作来完成的

  • 只要将三维数据置入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值