计算机图形学入门10:着色

1.真实的世界

         经过前面的变换,再到三角形遍历,深度缓存后,屏幕上每个像素都有了对应的颜色,显示的结果大概是如下左图的样子,我们发现物体每个面的颜色都一样,看起来不够真实。而如下右图显得更加真实,物体每个面看起来颜色不太一样。这就是着色(Shading)的效果。

                                        

        那么真实的世界是什么样的呢?如下图所示,物体在真实世界中存在各种不同的效果(材质),比如反射,光滑度等等,这就是接下来要做的事情,也就是着色

2.着色(Shading)

2.1着色的定义

        在图形学中,着色是对不同物体应用不同材质的过程

        举一个简单的例子,最基础的着色模型,叫做Blinn-Phong反射模型。

        如上图所示,物体表面受光照影响分为环境光漫反射高光反射三部分,如果通过一种方式可以分析并表示一个光源的这三部分影响,那我们就可以通过计算得到如上图杯子的材质。

        如上图,我们把物体表面任意一点当做一个着色点(Shading point),物体表面不一定是平整的,但是在局部一个极小范围内可以认为是一个平面。然后定义法线n,垂直于物体表面,v表示观测方向,通常指相机,i表示光源方向,看向光照的方向。定义的三个方向都可以做单位向量,后面出现默认都是指单位向量,长度是1。另外,还要定义物体表面的颜色(color),光亮(shininess)。

着色是局部的

        着色是局部的,就是说任何一个点的着色情况,不考虑其他物体的存在,比如不考虑其他物体产生的阴影。如下图所示,红色指向位置着色不考虑其他物体产生的阴影。那么阴影如何生成,之后再说。

2.2着色模型

2.2.1漫反射

        如上图所示,一条光线打到物体表面某个点,会被均匀地反射到四面八方,这种现象叫作漫反射(Diffuse Reflection)。表面颜色所在所有观测方向都是一样的。但是为什么实际上,在同一个光源下,物体表面的亮度不尽相同呢?主要以下两个原因:

1.光源与表面法线夹角

        如上图所示,假设一个光源有6根离散光线照射到物体表面,该表面大小为单位面积。当光线与物体表面垂直时,6根光线被物体表面全部接收,当物体表面与光线呈45度时,物体表面只能接收到一半的光线,只有一半能量,物体表面会暗一点。由此推出结论,物体接收光源能量的大小与光源与物体表面法线有关,成正比cosθ = l · n

2.光源与着色点的距离(衰减)

        如上图,假设光源位于中心,发射出的能量是I,随着时间的推移在三维空间中向周围均匀的辐射开来,图中的圆圈表示三维中的球壳,你会发现半径越大线越细,线的粗细表示能量的大小,从球心开始,半径越大球的表面面积越大,分到单位面积上的能量就越小。依据能量守恒定律(假设在真空传播,没有能量损失),某一时刻球壳上的能量与上一时刻球壳上的能量是相等的,因此某一点的能量与球的半径的平方成反比。

漫反射模型

        依据上述理论,人们总结得到了漫反射的计算模型Ld = kd(I/r^{2})max(0,n·l),它是经验模型。

        max(0,n·l)表示光线与物体表面法线夹角的影响,之所以使用max将点乘结果为负的结果排除,因为点乘结果为负数时,表示光源在物体表面的下方,计算光照没有意义。

        I/r^{2}表示光照衰减。

        kd表示漫射射系数或漫反射光颜色,物体表面本身颜色。如下图为kd系数影响漫反射情况。

        漫反射与光源方向有关,与观测角度v无关,也就是从任何角度看同一个表面,看到的颜色都是相同的。

2.2.2高光反射

        如上图,假设物体表面非常光滑,那么光线照射的到物体表面会反射出去,上图中R表示反射光线,为镜面反射方向。这时从v方向望去,在R附近一定的范围内(黄色部分),会有大量的光线射入眼睛,这时会观察到物体表面的高光。也就是v方向与镜面反射方向足够接近的时候,会产生高光反射,这个模型被称为Phong模型。

        后来人们发现判断视线v与反射光线R是否接近,可以用视线v和光源i的半程向量h与表面法线n是否接近来替代,这就是大名鼎鼎的Blinn-Phong模型,它也是经验模型。

       如上图所示,求半程向量h非常简单,只需要将vi相加,这就是为什么用Blinn-Phong模型,因为比Phong模型的R好算。

        为了判断hn是否接近使用向量点乘,点乘结果越接近1表示两个向量越近,越接近0表示越远。

        与之前的漫反射计算不同的是计算高光反射时进行p次幂计算呢,现实中物体表面高光通常会比较小,这个p次幂是为了加速高光衰减,使其在较小的角度内就衰减完。如下图所示:

        用余弦夹角可以来判断两个向量是否接近,但是容忍度太低了。如上图最左边所示,就算在45度也是一个比较大的值,也就是有还有很高的高光,而现实世界中的高光一般是一个很小非常亮的一个点,也就是能看到高光的夹角非常小,于是给它进行次幂运算,发现64次幂时,大约20度左右就可以衰减到0。在Blinn-Phong模型中指数p通常会取100到200之间的数

        计算高光参数与渲染结果的关系如下图所示:

        Ks表示镜面反射系数,从上到下,随着系数的增大,高光不断变量,来控制高光的亮度。
        从左到右随着指数p不断增长,看到高光的范围越来越小,也就是上文提到的通过指数来加速高光的衰减速度,使高光看起来更符合现实物体的高光。

2.2.3环境光

        在真实场景中,有些地方没有光源直接照射,但是通过光的反射到四面八方,所以这些地方间接的接收到了光。但是这个间接光是个很复杂的过程(全局光照),所以就假设一个恒定的环境光来模拟,用Ia来表示环境光照强度,Ka表示环境光的系数或颜色。

        环境光与直接光照的方向l无关,与观测方向v和表面法线向量n也无关,所以环境光是一个常数,也就是某一种颜色。所以环境光的作用是为了保证没有地方完全是黑的,提升一个亮度。

2.2.4Blinn-Phong模型使用

        如上图,一个物体将它的环境光、漫反射、高光依据模型计算后累加,可以获得非常不错的渲染效果,使用这种方式计算材质的模型叫作Blinn-Phong反射模型

        着色模型是考虑任何一个点(Shading point)长什么样,那么下一步自然是对所有的点进行着色操作,那整个场景就能看到了。

2.3着色频率

       如下图所示,三个球拥有完全相同的几何形状,为什么使用同一种着色后结果各不相同呢?因为着色频率(Shading Frequencies)不同。

        所谓着色频率,就是把着色运用到哪些点上。如果着色应用到每个面上,就是面着色(Flat Shading),如上图第一个球所示。

        如果着色应用到每个面的顶点上,就是顶点着色(Gouraud Shading),如上图第二个球所示。

        如果着色应用到每个像素上,就是片元(像素)着色(Phong Shading),如图上第三个球所示。

2.3.1面着色

        以物体的表面为单位进行着色计算,由于每个面只有一个法线,所以同一个面有相同的光照效果。一个面的法线比较好获取,取任意两个边做个叉乘得到的结果就是法线。面着色每个面着色一次,所以着色效果较差。

2.3.2顶点着色

        在每个顶点上进行一次着色,每个顶点有自己的法线,三角形内部通过插值的方法获得对应位置的法线。一般来说,顶点着色效果比面着色较好。

如何计算顶点法线

        我们已经知道三角面的法线可以通过三角面上任意两边叉乘得到。如下图所示,已知围绕顶点v的四个面的法线,要想获得顶点v的法线,思路是将共用该顶点四个面法向求和取平均值即 Nv = (N1+N2+N3+N4)/4。

        但是这种实用与周边三角形面积差异不大的情况,如果其中一个三角形面积特别大还有一个面积特别小,简单的求平均值算出来的法线无法准确描述这个顶点的法线,这时就需要通过加权平均来获得更真实的结果,这里加权平均的权就是对应三角形的面积。

        我们知道两个向量叉乘得到这两个向量组成的平面的法线,同时该法线的长度等于原向量合成的平行四边形的面积

        三角形的面积是平行四边形的一半,即所求三角形的法线的长度的一半为该三角形的面积。

2.3.3片元(像素)着色

        片元着色就是针对每个像素进行一次着色计算,会发现计算的高光更加圆润真实。但计算量也会更大。

        每一个像素的法线同样通过插值计算得到。如下图所示,假设已经知道了左右两个顶点的法线,那么中间每个像素的法线可通过两个顶点法线的插值得到。因为法线表示的是一个方向,所以计算后要记得归一化(调用normalize函数)变成单位向量。

        那么怎么样插值出中间的法线呢?这里就要用到重心坐标的方式。

2.3.4三种着色频率区别

        三种着色频率的区别也是取决于不同模型,也不能说面着色效果就一定是最差的。如上图所示,从上到小,球模型的几何形态更加光滑,三角型面数更多。可以发现,当几何足够复杂的情况下,面着色也能渲染出很好的效果,但是计算量也会增加。所以说,选择什么着色频率(方式),应综合考虑几何体的顶点数、想要达到的效果以及计算性能来决定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迁移学习和从头训练(from scratch)的区别

例如对于图像分类任务,有自己的数据集,打算利用 resnet 来实现,有2种实现方式, 第一种:利用在 ImageNet 上已经预训练过的预训练权重来进行 fine-tuning。第二种:不使用在 ImageNet 上已经预训练过的预训练…

2024年中漫谈

不知不觉,2024年已来到了6月,博主不禁感叹时光易逝,岁月的车轮滚滚向前,永不止步,此刻无关贫穷与富裕,伟大与平凡。 于是乎,宇宙(时空)看似毫无终点,一望无垠…

C++中的23种设计模式

目录 摘要 创建型模式 1. 工厂方法模式(Factory Method Pattern) 2. 抽象工厂模式(Abstract Factory Pattern) 3. 单例模式(Singleton Pattern) 4. 生成器模式(Builder Pattern&#xff0…

C# Task 包含 await ConfigureAwait CancellationTokenSource

Task以下是 Task 类的一些关键特性和用法&#xff1a;以下是一些使用 Task 的示例&#xff1a;创建并启动一个任务使用 await 等待任务完成处理任务异常使用 Task<TResult> 获取结果取消任务总结 await暂停方法执行&#xff1a;非阻塞调用&#xff1a;任务结果获取&#…

哈默纳科Harmonic谐波减速机应用领域有哪些

在制造设备中&#xff0c;精确控制速度与位置的需求日益凸显&#xff0c;这为谐波减速机的广泛应用提供了广阔的舞台。哈默纳科Harmonic谐波减速机以结构紧凑、高精度、高刚度、高可靠性、便于安装维护等优势&#xff0c;在工业机器人和自动化系统中发挥着举足轻重的作用。 一、…

C# 使用 webview2 嵌入网页

需求&#xff1a;C#客户端程序, 窗口里嵌入一个web网页&#xff0c;可通过URL跳转的那种。并且&#xff0c;需要将登录的身份验证信息&#xff08;token&#xff09;设置到请求头里。 核心代码如下&#xff1a; // 打开按钮的点击事件 private void openBtn_Click(object sen…

Docker 学习总结(82)—— docker 磁盘空间如何清理

一、删除停止的容器: docker container prune 二、删除未使用的网络: docker network prune 三、删除未使用的卷: docker volume prune 四、清理悬空镜像&#xff08;没有标签的镜像&#xff0c;通常是构建过程中产生的中间层&#xff09;: docker image prune 五、清理…

低-零功率技术在军事中的应用

“低-零功率”概念最先由美国国防部提出&#xff0c;主要是针对诸如俄罗斯等大国的远程传感器&#xff0c;帮助美军破除“灰色地带挑衅”的威胁。由于“灰色地带”冲突仅依托小规模军事力量&#xff0c;其强度维持在不足以引发美国及其盟国进行直接干预的程度&#xff0c;因此&…

二维码扫描,没有生成,生成比较复杂

一&#xff0c;增加远程依赖 app构建脚本中加&#xff1a; implementation com.journeyapps:zxing-android-embedded:4.3.0 二&#xff0c;注册表改一下 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://sch…

2024COSP上海国际户外展邀您一起享受户外徒步之旅,感受低碳新生活

在现在快节奏的生活中&#xff0c;我们常常忘记了那些慢慢走过的时光。科技的快速发展让我们得以快速穿越大地&#xff0c;却也让我们失去了与自然亲密接触的机会。许多壮丽的风景&#xff0c;并不是坐在车窗后、屏幕前就能够完全领略的&#xff0c;它们需要你放慢脚步&#xf…

Elasticsearch集群安全性:访问控制与加密通信

在现今的数据驱动世界中&#xff0c;Elasticsearch因其强大的搜索和分析功能而广受欢迎。然而&#xff0c;随着数据量的增长和安全性需求的提高&#xff0c;如何确保Elasticsearch集群的安全性成为了重要的议题。本文将探讨Elasticsearch集群的访问控制和加密通信两个关键的安全…

这总商务会议图怎么绘制?一行代码搞定...

今天这篇推文小编给大家介绍一个一直想绘制的图表-议会图(parliament diagrams),当然这也是柱形图系列变形的一种。绘制这种图表也是超级简单的&#xff0c;只需使用R-ggpol包进行绘制即可&#xff0c;当然&#xff0c;改包还提供其他优秀的绘图函数&#xff0c;下面就一起来看…

什么牌子充电宝质量好耐用呢?认准这几个充电宝,凭实力出圈

在快节奏的现代生活中&#xff0c;科技的不断进步使得各类移动设备如手机、平板和笔记本电脑成为人们生活中不可或缺的部分。为了应对这些设备不断增长的能源需求&#xff0c;充电宝市场的崛起迅猛并呈现出持续增长的态势。 在选购移动电源时&#xff0c;如何识别性能出众、质量…

【动态规划算法题记录】 509. 斐波那契数

递归法 看到题目的第一眼&#xff0c;直接递归&#xff01;完事 class Solution { public:int reversal(int n){if(n < 2) return n;else return reversal(n-1) reversal(n-2);}int fib(int n) {return reversal(n);} };动态规划 确定dp数组以及下标的含义 dp数组这里就…

机器学习现在的应用和未来的发展趋势

机器学习现在的应用 医疗领域&#xff1a; 机器学习算法在医疗领域的应用日益广泛&#xff0c;包括帮助医生诊断、预测病情&#xff0c;甚至辅助进行手术操作。通过图像识别技术&#xff0c;机器学习能够快速准确地找到肿瘤或其他疾病的迹象&#xff0c;并提供精确的测量数据。…

qmt量化交易策略小白学习笔记第29期【qmt编程之获取行业概念数据--如何下载板块分类信息及历史板块分类信息】

qmt编程之获取行业概念数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取行业概念数…

一网双引擎的定义和优势

一、定义&#xff1a; “一网双引擎”是数智化招采系统研发商郑州信源根据近20年对采购业务的理解&#xff0c;结合300多家项目实施经验提出的一种产品设计概念&#xff0c;是招标采购行业的一种创新模式&#xff0c;指的是以互联网平台为基础&#xff0c;通过传统引擎和新引擎…

Android studio 取消默认的标题栏

一、新建APP&#xff0c;默认是带标题栏的&#xff0c;如下图所示&#xff1a; 二、取消默认标题栏&#xff1a; 1&#xff09;、打开AndroidManifest.xml 2&#xff09;、找到android:theme"style/Theme.025NoActionApp" 3&#xff09;、更改为android:theme"…

k8s之kubelet证书时间过期升级

1.查看当前证书时间 # kubeadm alpha certs renew kubelet Kubeadm experimental sub-commands kubeadm是一个用于引导Kubernetes集群的工具&#xff0c;它提供了许多命令和子命令来管理集群的一生周期。过去&#xff0c;某些功能被标记为实验性的&#xff0c;并通过kubeadm a…

国产大模型:突破与挑战

在人工智能的浪潮中&#xff0c;国产大模型正逐渐崭露头角&#xff0c;成为技术创新和应用探索的焦点。然而&#xff0c;随着技术的快速发展&#xff0c;国产大模型也面临着稳定性和透明度的双重挑战。 技术的突破与应用的落地 国产大模型在技术层面取得了显著的进展&#xff…