概述
坐标系变换(理论)
在这里,我们不碰齐次坐标,不碰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。
反走样
一个直观的反走样方法,就是将一个像素分成几个小像素,对每小像素采样。
最后
以上就是勤奋雪碧为你收集整理的【Scratchapixel】坐标系变换、光栅化坐标系变换(OpenGL)光栅化反走样的全部内容,希望文章能够帮你解决【Scratchapixel】坐标系变换、光栅化坐标系变换(OpenGL)光栅化反走样所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复