从相机空间到屏幕投影,期间发生了什么

跟shader的关系

因为这是在学习shader期间写的文章,我会将它和着色器联系起来。
在顶点着色器中,完成的主要工作是坐标变换和逐顶点光照,一般而言,片段着色器会在其后根据顶点进行插值得出每个片元的信息。
从模型空间到屏幕投影,这是顶点着色器所控制的主要过程。刚刚说到主要工作有二,坐标变换自不必说,即便是逐顶点光照,也需要用到顶点的切向量和法向量,而切向量和法向量,也需要进行相应的变换。
关于切向量、法向量变换和顶点变换之间的关系,在计算机图形学坐标变换博客的最后有详细介绍。本文主要讲述整个过程,以及对每个过程的理解,如果你对图形学有粗浅的了解,那么从模型空间一直到相机空间,你可能都比较熟悉。而这篇文章的重点,也会放在相机空间到齐次裁剪空间那一段。

过程简介

物体最开始处于模型空间,这是一个左手坐标系,坐标点由建模者给出;随后经过矩阵变换到世界空间,再转换到相机空间。上述过程通常在顶点着色器中串联成一个MVP矩阵,在图形学的实现中,我们更多可操控的地方在于模型空间到世界空间的转换,而关于世界空间到视线空间,我们往往只需要指定相机的位置,朝向,和一个相对相机向上的向量,这三个向量可以唯一确定相机的位置和状态。

相机空间到屏幕投影发生了什么?

终于到重点了。
首先我们知道相机空间是以相机为原点的一个右手坐标系,而屏幕投影则是一个二维平面,所以我们至少需要完成两件事。
1. 有哪些物体会出现到二维平面上(这叫裁剪)
2. 那些物体应该出现在二维平面的哪个位置(这叫投影)

关于第一个问题,我们先给出一个通俗易懂的解答,然后再解释这个解答会再提出什么新的问题,然后解决它。
回答是,所有在视野范围内的物体都会出现在最后的二维平面内,这很好理解,当我们玩游戏的时候,就是通过显示器这个窗子看到后面的物体。
那么我们该如何表示我们的视野?
利用视锥,由于笔者懒得找图片,你可以想象一个四棱锥,把你的眼睛放在最尖的位置,再把最尖的部分砍断,让它变成一个四棱台。这时候你的眼睛正前方就是一个四变形,你能看到的范围,恰好就是整个四棱台,而那个四棱台,就是视锥。
我们将你的眼睛定义为坐标原点,这是一个右手坐标系,你眼睛的前方看向了 -z ,你的右手边是x的正半轴,头顶是y的正半轴。
靠近你眼睛的小的四边形被称为近平面,而四棱台的底就是远平面,虽然你的视力如果足够好那么你可以说你可以看的无限远,但是太远的地方其实意义并不大,所以我们只假设你只能看到近平面和远平面之间的物体。
现在我们尝试去决定有哪些物体出现在二维平面上,也就是解决我们的第一个问题。其实已经给出了答案,在视锥内部,或者至少有部分零部件在视锥内部的物体我们才会给它出现在屏幕上的机会。
作为人类,你可以拿把刀沿着视锥削一遍,但是计算机该怎么做?
一个四棱台对计算机来说是不是太不友好了?
于是我们引入了一个叫投影矩阵的东西,虽然我们并没有在这里进行投影。(我们的第二个问题才是投影呢)但是这里确实为解决第二个问题也提供了一些帮助,很多书上都说投影矩阵是为后续的投影做准备。
那么投影矩阵,做了什么?
它完成了物体从相机空间到齐次裁剪空间的转换。
矩阵比较复杂,我们只简要介绍矩阵的实现过程,请在心中想象一个视锥,再想象一个立方体,我们现在要将前面的视锥变成后面的立方体了。
可能我需要对你的想象加以限定,从视锥顶点(就是你的眼睛)发出两条线,穿过视锥,这两条线并不是平行的,但是穿过同样物体的齐次裁剪空间的两条线,就可以做到平行。我们说视锥对计算机不友好,而立方体就非常完美,如果立方体的正中心为圆心,那么对于坐标为

一点补充说明

透视投影的视锥是四棱台,但是正交投影的视锥就是一个立方体,也可以拿这个方法做吗?
当然可以,经过相同的变化,正交投影的w值为1,所以除以w,并不会产生任何影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值