内容参考songho.ca/opengl、learnopengl
坐标变换流程
坐标变换主要发生在顶点处理阶段,外加光栅化进行一次视口变换

各个阶段变换说明:
- Model 变换,指模型本身的调整,比如一个人物模型,建模的时候原点放在腰上,放到场景中,一半在平面坐标系下面了,要把脚和地平面对齐,Model变换加一个向上的平移
- VIEW 变换,opengl本身没有相机的概念,场景视角默认冲着屏幕里,即-z轴。相机的变换是通过对场景做逆变换实现的,比如相机旋转30°,则实际是将场景旋转-30°
- Projection 变换,空间中的坐标最后都要在二维的平面上绘制,Projection就是将3D的坐标变换到2D(不太准确,下面会深入projection原理)
看下图,3.View Space到4.CLIP SPACE的区别,经过透视投影到剪裁空间后,物体符合近大远小的视觉效果,立方体背面的xy坐标变小了,更靠近原点,右边锥体的尖儿也相对的远离原点了(尖儿更靠前)

整个渲染过程涉及5个坐标系,坐标范围如下,参考下图
| 坐标系 | 坐标范围 | 说明 |
|---|---|---|
| Object/Local Coordinate | [-∞, +∞] | 空间任意值 |
| Eye/View Coordinate | [-∞, +∞] | 空间任意值 |
| Clip Coordinate | [-∞, +∞] | x、y在近平面的宽高范围内 |
| NDC coordinate | [-1, +1] | 投影变换之后,除以齐次坐标W得到 |
| Screen Space | [0, 宽/高] | 窗口宽高范围内 |

注:opengl是右手坐标系,拇指、食指、中指分别指向x、y、z轴正方向

注,Divide by w这一步是opengl管线自己做的,开发者只要按要求计算好齐次坐标的w值。
齐次坐标理解参考:Homogeneous Coordinates
model view projection变换,我们一般简称为mvp变换,mv相对简单,重点看看projection变换实现
投影矩阵
投影分两种:
- 透视投影(Perspective Projection),会渲染成近大远小
- 正交投影(Orthographic Projection),长宽按照1:1渲染,不会缩放
正常情况下,场景的渲染使用透视投影,一些特殊的场景会选择正交投影,比如游戏中人物的血条,平行光的阴影图(shadow map)
projection变换后得到clip space坐标P( x c , y c , z c , w c x_c, y_c, z_c, w_c xc,yc,zc,wc)

opengl管线会根据clip坐标进行剪裁,在camera视锥范围外的顶点会被丢弃,判断计算:

如果出现裁剪,OpenGL会在网格的裁剪处进行重建
透视投影(Perspective Projection)

透视变换中,假设人眼/相机看到的是一个被裁剪的金字塔锥体,3D坐标投影变换后,映射到单位立方体空间内[-1, 1],
- x轴范围[l, r] ==> [-1, 1]
- y轴范围[b, t] ==> [-1, 1]
- z轴范围[-n, -f]==> [-1, 1]
右手坐标系下,camera看向-z方向,这里n、f > 0,所以前面加负号
理解透视变换的关键在于,要凑出一个矩阵,使得点 ( x e y e , y e y e , z e y e , w e y e ) (x_{eye}, y_{eye}, z_{eye}, w_{eye}) (xeye,yeye,z

文章详细阐述了OpenGL渲染管线中的坐标变换过程,包括模型变换、视图变换和投影变换。模型变换调整物体在场景中的位置,视图变换模拟相机视角,投影变换将3D坐标转换到2D空间。重点讨论了透视投影和正交投影的区别,以及如何通过投影矩阵将坐标映射到剪裁空间和NDC空间。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



