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

news2024/12/23 18:38:12

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.coloradmin.cn/o/1818778.html

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

相关文章

java学生考勤管理系统

学生考勤管理系统 学生考勤管理系统。功能:登录,班级管理,课程管理,用户管理,课程表管理,个人信心,修改密码。 技术:java,ssh,struts,spring&…

动手学操作系统(七、实现内存分页机制)

动手学操作系统(七、实现内存分页机制) 在上一节中,我们成功读取了物理内存的容量,并且在之前的学习中,我们的程序已经进入了保护模式,地址空间能够达到4GB,但是所有的进程(包括操作…

开发TEE的踩坑之配置PCCS

系统:Ubuntu20.04(双系统,非虚拟机) 一、解决node.js的版本问题二、解决开启PCCS服务的问题1、解决开启PCCS服务2、解决访问本地的8081端口 本系列为笔者开发TEE(Trusted Execution Environment,可信执行环…

k8s metrics-server服务监控pod 的 cpu、内存

项目场景: 需要开启指标服务,依据pod 的 cpu、内存使用率进行自动的扩容或缩容 pod 的数量 解决方案: 下载 metrics-server 组件配置文件: wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/…

【已解决】Python 中 AttributeError: ‘NoneType‘ object has no attribute ‘X‘ 报错

本文摘要:本文已解决 AttributeError: ‘NoneType‘ object has no attribute ‘X‘ 的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。 😎 作者介绍:我是程序员洲洲,一个热爱…

HTML静态网页成品作业(HTML+CSS+JS)—— 美食企业曹氏鸭脖介绍网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现 图片轮播切换,共有4个页面。 二、…

称重显示模块 Modbus RTU 通信

目录 一、智能称重数字显示器模块(带通信)1、称重传感器接线说明称重显示模块称重传感器USB 转 TTL 2、校准传感器(标定:零点标定、满度标定) 二、Modbus RTU 协议1、Modbus RTU 数据帧2、数据帧格式请求帧响应帧 三、上位机电脑与称重显示模…

使用神卓互联来访问单位内部web【内网穿透神器】

在现代工作环境中,有时我们需要从外部访问单位内部的 web 资源,而神卓互联这款内网穿透神器就能完美地满足这一需求。 使用神卓互联来访问单位内部 web 其实并不复杂,以下是大致的使用步骤和配置方法。 首先,我们需要在单位内部的…

基于Unet++在kaggle—2018dsb数据集上实现图像分割

目录 1. 作者介绍2. 理论知识介绍2.1 Unet模型介绍 3. 实验过程3.1 数据集介绍3.2 代码实现3.3 结果 4. 参考链接 1. 作者介绍 郭冠群,男,西安工程大学电子信息学院,2023级研究生 研究方向:机器视觉与人工智能 电子邮件&#xff…

【电机】开环控制系统和闭环控制系统

1 什么是控制系统 控制系统是指由控制主体、控制客体和控制媒体组成的具有自身目标和功能的管理系统。也可以理解为:为了使控制对象达到预期的稳定状态。例如一个水箱的温度控制,可以通过控制加热设备输出的功率进而来改变水温达到目标温度,…

Linux发邮件的工具推荐有哪些?如何配置?

Linux发邮件的功能怎么样?Linux系统如何设置服务器? 在Linux操作系统中,有多种工具可供选择用来发送电子邮件,每种工具都有其独特的特点和适用场景。AokSend将介绍几种常用的Linux发邮件工具,并分析它们的优缺点和适用…

接口自动化测试的全面解析与实战指南!

🚀 【引言】🚀 接口自动化测试,作为现代软件开发生命周期中的关键一环,扮演着“质量守门员”的角色。它不仅关乎提升开发速度,更在于确保每一次更新都能可靠地满足用户期待。接下来,我们将踏上一场深入浅出…

Redis分布式锁的实现、优化与Redlock算法探讨

Redis分布式锁最简单的实现 要实现分布式锁,首先需要Redis具备“互斥”能力,这可以通过SETNX命令实现。SETNX表示SET if Not Exists,即如果key不存在,才会设置它的值,否则什么也不做。利用这一点,不同客户端就能实现互斥,从而实现一个分布式锁。 举例: 客户端1申请加…

RH850---注意问题积累--1

硬件规格(引脚分配,内存映射,外设功能规格、电气特性、时序图)和操作说明 注意:有关使用的详细信息,请参阅应用说明 ---------外围函数。。。 1:存储指令完成与后续同步指令的一代 当控制寄存器被存储指令更新时,从存储的执行开始…

在网站建设时,如何选择适合自己的网站模版

可以根据以下几个地方选择适合的网站模板 1.公司的核心业务 根据公司的业务内容来确定网站展示的内容之一,不同的业务内容可以有不同的展示方式,以此来确定网站的展示风格之一,公司肯定是要有明确的业务内容,并且能够在网站…

[C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法

【训练源码】 https://github.com/albrateanu/LYT-Net 【参考源码】 https://github.com/hpc203/Low-Light-Image-Enhancement-onnxrun 【算法介绍】 一、研究动机 1.研究目标 研究的目标是提出一种轻量级的基于YUV Transformer 的网络(LYT-Net)&…

neo4j-官网学习

1、cypher 代码学习文档 https://neo4j.com/docs/cypher-cheat-sheet/5/auradb-enterprise 2、APOC函数包安装(desktop) 直接点击就可以安装,安装完之后重启一下,Cypher查询中使用CALL apoc.help(‘apoc’)来检查APOC插件是否已…

Java技术驱动的工程项目管理系统源码:工程管理的数字化解决方案

工程项目管理系统是一款基于Java技术的专业工程管理软件,它采用了Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI等前沿技术,通过前后端分离架构构建了一个功能全面的工程项目管理系统。 随着公司的发展,工程管理的需求日益增长&#x…

图像处理与视觉感知复习--彩色图像处理

文章目录 三原色原理及其两种应用常用彩色模型及其应用领域各种颜色模型的转换彩色图像处理 三原色原理及其两种应用 三基色原理 自然界中绝大多数的颜色都可看作是由红、绿、蓝三种颜色组合而成;自然界中的绝大多数的颜色都可以分解成红、绿、蓝这三种颜色。这即…

渗透测试模拟实战-tomexam网络考试系统

渗透测试,也称为“pentest”或“道德黑客”,是一种模拟攻击的网络安全评估方法,旨在识别和利用系统中的安全漏洞。这种测试通常由专业的安全专家执行,他们使用各种技术和工具来尝试突破系统的防御,如网络、应用程序、主…