我是靠谱客的博主 勤奋雪碧,最近开发中收集的这篇文章主要介绍【Scratchapixel】坐标系变换、光栅化坐标系变换(OpenGL)光栅化反走样,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

坐标系变换(理论)

在这里,我们不碰齐次坐标,不碰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)光栅化反走样所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部