光栅化[通俗易懂]

光栅化[通俗易懂]定义一个宽高比(AspectRatio);还有垂直可视角度verticalfield-of-view(fovY)。垂直可视角度即从相机原点到上顶中点和下底中点的连线的夹角,可视角度大可以类比

大家好,又见面了,我是你们的朋友全栈君。

光栅化[通俗易懂]

定义一个宽高比(Aspect Ratio);还有垂直可视角度 vertical field-of-view (fovY) 。垂直可视角度即从相机原点到上顶中点和下底中点的连线的夹角,可视角度大可以类比成广角相机,它张得就比较开,适合拍近距离的物体;可视角度小,透视投影就越不明显,越像正交投影,就很容易能拍到远处的物体。水平可视角度可以类比。

光栅化[通俗易懂]

这就是说,如果我们想要定义一个视锥的话,定义一个垂直可视角度、定义一个宽高比,其他的变量就都可以转化得到。

 

MVP 变换将三维物体投影到二维平面,所有物体都在 [ -1, 1 ]3 的空间里。那么下一步就是如何将这 [ -1, 1 ]3 的立方体在屏幕中显示出来,这就是光栅化。

屏幕就是一个典型的光栅成像设备。

光栅化[通俗易懂]

我们定义屏幕左下角是原点,向右是 x,向上是 y。所有像素点的位置从 ( 0, 0 ) 到 ( width – 1, height – 1 ) 。像素 ( x, y ) 的中心在 ( x + 0.5, y + 0.5 ) 。屏幕的范围从 ( 0, 0 ) 到 ( width, height ) 。

我们首先不管 z 方向,只管 x、y 方向,即 [ -1, 1 ]2 转化到 [ 0, width ] × [ 0, height ] 。

光栅化[通俗易懂]

就做了一遍缩放和平移。这种变换就叫做视口变换,将 [ -1, 1 ]2 的空间转化到 [ 0, width ] × [ 0, height ] 的屏幕空间。

 

那么接下来就是要真正把多边形打散成像素,即光栅化过程。

使用三角形作为基础形状几何体有众多好处。三角形是最基础的多边形,再退化就变成线段了;任何其它的多边形都可以拆分成三角形;三角形内部一定是平面的,比如四边形就不能保证是平面;三角形内外是清晰的,比如多边形内部如果有洞怎么办,像甜甜圈那样,如果不是凸多边形怎么办,其他多边形就有各种各样的问题,而三角形就可通过向量的叉乘来判断一个点是否在内部还是外部;只要定义三角形三个顶点的属性,在三角形内部就可做一个渐变来填充三角形内部所有像素的属性。

光栅化[通俗易懂]

三角形覆盖的每一个像素点该如何取值呢?

光栅化[通俗易懂]

这就是我们下一步要做的,光栅化中最重要的,即判断一个像素的中心点与三角形的位置关系。

有一个最简单的办法来做光栅化,就是通过采样(Sampling)的方法。采样其实就是对一个函数离散化的过程,比如 f(x) = sin x ,就要拿各种各样的点来问函数的值是多少。

那么我们拿像素中心来对屏幕空间进行采样,就是要算出屏幕空间的函数在某一个像素中心它的值是多少。

光栅化[通俗易懂]

我们定义一个 inside 函数:

光栅化[通俗易懂]

光栅化[通俗易懂]

向量做叉乘,判断是否都在向量的左侧,则在三角形内部,否则就在外部。

光栅化[通俗易懂]光栅化[通俗易懂]

考虑一个三角形,按特定顺序排列顶点 A、B、C,然后不断做向量叉乘,要么 z 全是正的,要么 z 全是负的,在这两种情况下才会判定像素点在三角形内部。

而如果一个点正好在三角形的边上,那就是自己定义了,可以不做处理,也可以特殊处理。

光栅化[通俗易懂]

而且也不需要遍历所有的像素点,我们知道三角形三个顶点坐标后,就能确定一个最大的正方形区域,那是我们需要考虑的,其他的都不用处理。

光栅化也有其它的加速方法:

光栅化[通俗易懂]

每一行我都找它的最左和最右,这样的话我一个像素也不会多考虑。对于某些细长条的斜向的三角形就很适合用这种方法。

真实情况下的光栅化:

光栅化[通俗易懂]

第二种是 Bayer Pattern,可以让红绿蓝均匀地分布在屏幕空间上,可以看到绿色的点要更多,这是因为人眼本身对绿色最为敏感,比如在相机上也是这样,对绿色的感光元件会设置更多,从而人眼看上去要更舒服。

在彩色打印机上会有更复杂的分布:

光栅化[通俗易懂]

光栅化后能看到一个很明显的现象,就是锯齿(Jaggies)

光栅化[通俗易懂]  光栅化[通俗易懂]

锯齿就是光栅化图形学里面一直在致力于解决的严重问题。

光栅化[通俗易懂]

可以初步分析,我们的采样率对于信号来说是不够高的,所以产生了信号的走样问题(Aliasing)。所以我们下一步就是抗锯齿,或者反走样,这是图形学中重大的技术。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155421.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Canny边缘检测算法(python 实现)

    Canny边缘检测算法(python 实现)文章目录最优边缘准则算法实现步骤1.应用高斯滤波来平滑(模糊)图像,目的是去除噪声2.计算梯度强度和方向3.应用非最大抑制技术NMS来消除边误检4.应用双阈值的方法来决定可能的(潜在的)边界5.利用滞后技术来跟踪边界opencv实现Canny边缘检测手写代码参考文章最优边缘准则  Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:  (1)最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;  (2)最优定

  • python h5文件读取_python读取整个txt文件

    python h5文件读取_python读取整个txt文件这篇文章是一个工具类,用来辅助医学图像分割实战unet实现(二)4、数据存储这一小节的内容。文件:HDF5DatasetGenerator.py#-*-coding:utf-8-*-importh5pyimportosimportnumpyasnpclassHDF5DatasetGenerator:def__init__(self,…

  • 如何把本地项目上传到Github

    如何把本地项目上传到Github

    2021年10月10日
  • pycharm打开运行窗口_pycharm的terminal怎么用

    pycharm打开运行窗口_pycharm的terminal怎么用设置PyCharm软件中Terminal窗口中启动的python交互命令的版本python2和python3有很大的不同,使用python2编写的程序,如果使用python3就运行不了;使用python3编写的程序,如果使用python2一样也是不用运行。我的电脑中,python2和python3这两个版本都有。并且python3添加到了环境变量里面,而pyt

  • Redis可视化客户端redisClient下载[通俗易懂]

    Redis可视化客户端redisClient下载[通俗易懂]百度网盘下载地址:https://pan.baidu.com/s/1X4ZtY9n-rJeRySGkIa1wdA提取码:061f

    2022年10月12日
  • no jump_jump out

    no jump_jump outCprovidesaformofuser-levelexceptionalcontrolflow,calledanonlocaljump,thattransferscontroldirectlyfromonefunctiontoanothercurrentlyexecutingfunctionwithouthavingtogothroug

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号