【Scratchapixel】坐标系变换、光栅化

坐标系变换(理论)

在这里,我们不碰齐次坐标,不碰w分量,从理论上来看看图形学中的坐标变换和光栅化。

Local -> world -> camera -> projection -> NDC -> screen

 

Local, World, Camera coord: 只是分别以local, world, camera为原点的一个直角坐标系(笛卡尔坐标系)。

projection coord: 将三角形三个点的x, y执行透视除法投至画布(投影面),z取反。(因为在camera坐标系中,z是负的)

NDC: 标准化坐标系。将三个点的x, y 分别从【l, r】和 【b, t】缩放至【-1, 1】。其中【l, r】为画布的左右边x坐标,【b, t】为画布的下上边y坐标。(这4个数是在定义视锥体后自动算出的)

Screen coord: 先将三个点的x, y从NDC变换到【0, 1】(加1再除以2),再乘以频幕分辨率。

如果感觉哪里不清楚,请移步至原作者:https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation

 

坐标系变换(OpenGL)

大体上和理论的过程差不多,只不过在OpenGL(包括D3D)里,是通过矩阵乘法来实现的。而矩阵必须是4×4的(否则构造不出平移矩阵),因此将三维的笛卡尔坐标系扩充至四维的齐次坐标系。对应关系如下:

齐次坐标系(x, y, z, w)

笛卡尔坐标系(x/w, y/w, z/w)

坐标系转换如下:

Local -> world -> camera -> clip -> NDC -> screen

可以看到在projection coord被替换为clip coord。

前三个坐标系也变成齐次坐标系,只不过w设为1。到clip坐标系时,w就不是1了。

这里有个小trick:在构造投影矩阵(camera -> clip的矩阵)时,先把NDC的样子写出来,再构造矩阵。

即:投影矩阵将camera space的齐次坐标变换到NDC坐标所对应的齐次坐标。

所以,vertex shader里的gl_Positon 是 NDC坐标(笛卡尔系)对应的齐次坐标。

原文详见http://www.songho.ca/opengl/gl_projectionmatrix.html#perspective

 

 

光栅化

现在,我们有了三个点的屏幕坐标(0<=x<=1920, 0<=y<=1080,浮点型),开始进行光栅化。(rasterization)

 

根据三个点的屏幕坐标,确定bounding box。(整数)。

遍历像素点。对于某个像素点,有:

               取其中心坐标(如:第100列第20行的像素点,则取p =(100.5, 20.5)),并用之与三个点的x, y进行edgeFunction(判定点p是否在三角形内部),在此可顺便算出p的重心坐标/权重(w0, w1, w2)。重心坐标可用来插值(像素的)颜色和深度值。

先插出深度值,再结合深度值插颜色。

深度值插法:即为该像素的深度值。

颜色插法:。很好理解:越远的地方(深度值越大的地方)颜色贡献越小,所以C除以一下深度值Z。

 

反走样

一个直观的反走样方法,就是将一个像素分成几个小像素,对每小像素采样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值