|
分享和整理一些觉得不错的教程和理解
在此感谢各位老师!
教程:
线性代数基础:https://www.bilibili.com/video/BV1ib411t7YR?p=1
GAMES101-现代计算机图形学入门-闫令琪:https://www.bilibili.com/video/BV1X7411F744
GAMES202-高质量实时渲染-闫令琪:https://www.bilibili.com/video/BV1YK4y1T7yY
华中科技大学-计算机图形学-万琳:https://www.bilibili.com/video/BV1Zj411f7S3?p=13&spm_id_from=pageDriver
论坛:
计算机图形学与混合现实研讨会
博客:
冯乐乐(Shader入门精要)http://candycat1992.github.io/
GPU渲染管线的工作过程
image.png
几何阶段
空间变换:模型空间(左手)→世界空间(左手)→观察空间(右手)
image.png
投影准备:观察空间→观察空间(投影变换)→观察空间(裁剪空间)
经过以上变换,此时物体处在裁剪空间,
★下图需要注意,每个教材的解释略有不同,下图直接就齐次除法变成规范化的了
实际上这里只是为真正是投影(齐次除法)做准备,此时裁剪面依然是梯形四棱锥形态
目的:
1.为后面真正投影做准备,赋予W特殊意义。
2.对X,Y,Z缩放,W作为范围值,便于裁剪。
裁剪空间之前,W=0表示矢量方向,W=1表示点,投影变换之后,W的意义改变了,如下
投影变换对X,Y,Z分量进行缩放,W分量变成-z,如X,Y,Z在W范围内[-w,w],说明该顶点在裁剪空间内
Unity下,观察空间为右手坐标系,列矩阵右乘,投影变换后Z分量范围为[-w,w]
DirectX,投影变换后Z为[0,w]
进入裁剪空间后,右手坐标系,转为左手坐标系,离摄像机越远Z值越大
image.png
屏幕映射:规范化的观察空间(裁剪)→屏幕空间(真正的投影)
齐次除法=透视除法=归一化的设备坐标NDC(OpenGL)=W分量除以X,Y,Z分量
裁剪空间→NDC(经过齐次除法后,变换到一个立方体内)
立方体X,Y,Z分量的范围是[1,-1](OpenGL)
DirectX中Z分量是[0,1]
Unity=OpenGL
Unity中屏幕空间左下角是[0,0],右上角是[pixelWidth,pixelHeight]
由于当前的X,Y都是[1,-1],所以屏幕映射就是一个缩放的过程
此时Z分量经过齐次除法,也就是除W,得到的数值直接存进了深度缓冲区,这步是自动的,当然也可手动
W分量的意义主要是充当分母来得到NDC
image.png
以上就是从模型空间变换到屏幕坐标的过程
光栅化阶段
image.png
下面说下关于屏幕坐标的问题
视口空间坐标公式如下
image.png
上面公式的思想就是,首先对裁剪空间下的坐标进行齐次除法,得到范围在[ 1, 1] 的 NDC,然后再将其映射到范围在[ 0, 1] 的视口空间下的坐标。
ComputScreenPos 用法
image.png
image.png
Unity中先在顶点着色器里将其映射到范围[ 0, W] ,然后再片段着色器中自己手动齐次除法变为[ 0, 1] 。
z和w值就是裁剪空间下的值。
详情请看ComputScreenPos ,其定义位于UnityCG.cginc中
常用数学知识
Sin:对边比斜边
Cos:邻边比斜边
Tan:对边比临边。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|