光栅化[通俗易懂]

光栅化[通俗易懂]定义一个宽高比(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)。所以我们下一步就是抗锯齿,或者反走样,这是图形学中重大的技术。

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm 命令行_pycharm叫什么

    pycharm 命令行_pycharm叫什么一、pycharm常用命令1全局查找/替换某个字符串ctrl+shift+r2当前文件查找某个字符串ctrl+f3当前文件替换某个字符串ctrl+r4全局查找指定文件名的文件ctrl+shift+n5全局查找指定类名的类ctrl+n二、pycharm常用操作1获取当前文件对应的项目的树形目录结构所在位置点击左侧项…

    2022年8月29日
    0
  • IDEA快捷键设置-设置成和Eclipse一样「建议收藏」

    IDEA快捷键设置-设置成和Eclipse一样「建议收藏」用惯了eclipse的同学可能会对IDEA的快捷键不习惯,所以这里打包了一份eclipse中快捷键的设置。直接导入IDEA就可以使用。链接:https://pan.baidu.com/s/1FmXOQeqy6RxfD05mKdq3dQ提取码:c0px…

    2022年6月20日
    88
  • elastic search数据库集群部署「建议收藏」

    elastic search数据库集群部署「建议收藏」ES数据库安装elasticasearchelasticsearch的概念:是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎ApacheLucene基础上的搜索引擎,使用Java语言编写。1、elasticsearch和MongoDB/redis/memcache一样,是非关系性数据库是一个接近实时的搜索平台,从所索引这个文档到能够被搜索到只有一个轻微的延迟,企业应用定位:采用restfullapi标准的可扩展和高可用的实时数据分析

    2022年6月9日
    40
  • python如何多行输出_python换行输出 Python里具体怎么用\n换行输出一个数字?[通俗易懂]

    python里如何把每打印10个数就换行的实现print(“每输出十个数字换行,共计输出100个:”)fornuminrange(1,100):#循环一百次print(“%3d”%num,end=””)#不换行输出if(num%10==0):print(“”)#换行输出人的一生要有多艰难,多坎坷而又要多幸运,多凑巧,才能遇到一个绊住自己心的人。如何用python将内…

    2022年4月10日
    88
  • 浅谈欧拉函数[通俗易懂]

    浅谈欧拉函数[通俗易懂]前言欧拉函数听起来很高大上,但其实非常简单,也是NOIP里的一个基础知识,希望大家看完我的博客能有所理解。什么是欧拉函数欧拉函数是小于x的正整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1。如何计算欧拉函数通式:φ(x)=x∏ni=1(1−1pi)∏i=1n(1−1pi)\prod_{i=1}^n{(1-\frac{1}{p_i})}φ(1)=1其…

    2022年8月22日
    6
  • 加密狗android,Android系统加密狗的设计与实现

    加密狗android,Android系统加密狗的设计与实现摘要:随着IT产业的迅猛发展,软件作为IT产业中的一项重要产品,现在已经随着电脑进入千家万户,深入到用户生活中的每个地方。但是针对软件,有一个问题一直存在,那就是软件盗版的问题。随着软件影响范围的扩大,盗版软件带来的危害也是越发的严重。另外,智能手机也已经进入一个高速发展期,Android系统手机在智能手机市场中占据很大的一块份额。在这样的背景下,本文提出一种使用Android系统手机对软件进行…

    2022年5月13日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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