当前位置: 首页 > news >正文

计算机图形学-GAMES101-7

引言

 场景中有很多的三角形,如果实现可见性和遮挡呢?
 一个简单的想法是,从远到近画,近处的物体自然会覆盖掉远处的物体,这种画法也叫画家算法。
 但是实际绘制中物体的顺序是不容易确定的,比如如下图绘制一个立方体:
在这里插入图片描述

 在空间中,两个三角形或者两个面之间的前后关系并不是唯一的,如下图所示:在这里插入图片描述

一、深度缓存Z-Buffer

 因此我们不能给空间中的三角形定义前后顺序关系,也因此不能使用画家算法,甚至不能对三角形整体进行绘制。使用什么方案才能实现可见性和遮挡呢?
 使用Z-Buffer深度缓存。对于每一个像素,我们记录覆盖它的物体片段的Z值,当循环到一个新的片段时,我们比较新片段Z值和像素处记录的Z值,如果新片段Z值更大即离摄像机更近覆盖了旧片段,则更新像素处的Z值,并将此片段的颜色值赋值给这个像素。
 伪代码如下所示,对于每一个三角形中的每一个像素,去计算这个像素是否会被这个三角形的颜色更新。最后就得到了每一个像素处的颜色值。
在这里插入图片描述
 在现代渲染中,我们使用颜色缓存记录每个像素处的颜色值,我们使用另一个缓存记录每个像素处的最大Z值,这个缓存就叫做深度缓存Z-Buffer。
在这里插入图片描述
 深度缓存工作流程示意图:
在这里插入图片描述
 深度缓存的时间复杂度为O(n),因为就是求了个最大值而已。
 Z-Buffer无法处理透明物体的深度,透明物体需要特殊处理。
 计算机保存和计算浮点数是有误差的,因此基本上两个浮点数永远不会相同。在现实中偶尔会出现深度值相同,比如我们自己定义的地板和人脚的深度值,通常我们都把他们设置为0,这会导致一些不好情况的发生。你可能会有疑问,地板和脚,是高度是y值,怎么是深度呢?我们现在所说的深度是指从游戏中摄像机的方向看去,也就是说坐标系并不是世界坐标系。比如你玩3A游戏时,朝自己的脚看,那脚和地面的前后关系不就是深度Z值决定的吗?这是因为我们现在讨论的深度是在观察坐标中的,即摄像机位于坐标系原点,而摄像机朝向的方向就是Z轴(在本课中为-Z半轴)。

二、Shading引言

(1)我们现在能做的

 通过之前的内容,我们可以通过观察矩阵将摄像机和模型转换到标准位置,再通过投影和视口变换将三维空间映射到二维空间,再通过光栅化采样和反走样得到屏幕上每个像素的颜色值。
在这里插入图片描述
 渲染到此就结束了吗?如果我们止步于此,我们只能得到下图的渲染效果:
在这里插入图片描述

(2)我们期望的效果

 貌似这并不是我们想要得到的,它看起来并不真实。我们期待看到的应该是这种效果:
在这里插入图片描述
 这张图看起来更加真实一些,为什么呢?它和第一张图有什么区别吗?仔细看第二张图中的立方体,你会看到它同一个面的颜色有所不同,比如每个立方体的上表面,而第一张图无论何时何地每一个面给我们呈现的颜色都是相同的。注意第二张图每个立方体的左侧面,它是很暗淡的,带给我们一种真实的视觉感。这像是什么呢?阴影!我们想要还原3D真实世界中的效果,就必然要模拟真实世界中的光照、阴影等效果才行。

(3)模拟真实的世界

 如下图(渲染的),为什么我们能看到的世界是五彩缤纷的?
在这里插入图片描述

三、Shading

 什么是着色呢?引入明暗的不同。着色的定义:对不同的物体,应用不同材质的过程。
 不同的材质和光线的相互作用不同。

(1)Blinn-Phong反射模型

 Blinn-Phong是一个着色模型,它考虑了物体的高光、漫反射、环境光。反射示意图如下:
在这里插入图片描述
 定义v为观察方向、n为法线方向、I为反射方向,三个向量都是单位向量。
 shading≠shadow,即着色不等于也不考虑阴影。对于任意一个片段的着色,我们只考虑片段本身,不考虑其他任何物体的存在。

(2)漫反射Diffuse Reflection

 漫反射可以实现物体表面颜色的渐变效果。
 一束光从光源发出,到达物体某个点,再经过反射进入我们的眼睛。计算我们看到的颜色,就是计算反射光的强度。
 计算反射光的强度,先要考虑反射强度,即入射光有多少被反射了?还要考虑入射光强度,即从光源到反射点,有多少光被衰减了?

(2.1)反射强度

 某个地方接收到的光照强度,使用单位面接接收到的光照能量去衡量。如下图所示,物体接收到光的能量与 入射方向和表面法向量间夹角的余弦值 成正比,我们使用这个余弦值去代表反射的强度。
在这里插入图片描述

(2.2)入射光的衰减

 考虑点光源的能量是发散的,以点光源为球心,不断发散到一个又一个的球壳上。能量是守恒的,即球壳表面能量之和不变,但是随着球壳向外的传播,球壳表面积会增大,导致每一条光线的能量逐渐变小。
 理想化的假设光源每时每刻散发出的能量相同为E,则在任意一个时刻t,这些能量E一定均匀散布在一个半径为r的球壳上,则单位面积球壳具有的能量为E/(4πr ^ 2)。任意一个距点光源距离为r的物体,我们可以得知它接收到的能力为E/(4πr ^2),4π为常数,因此我们可以得出:物体接收到光的强度和它距离光源距离的平方成反比(注意这只针对点光源,并且没考虑遮挡)。
在这里插入图片描述

(2.3)计算公式

 点乘为负表示光线射到的是反面,没有物理意义所以使用MAX函数。
 在真实世界中物体是有不同的材质的,物体是会吸收光的能量的,kd就是度量的物体对能量吸收的强弱,称为:漫反射系数。如果kd为0,物体就会吸收所有的光,而不会有光反射处理导致我们看到的都是黑的,比如黑猫效应。kd可以是一个三维向量,分别对应物体对RGB三原色的吸收。
在这里插入图片描述
 最终实现的渐变效果:
在这里插入图片描述
 注意漫反射计算公式中没有涉及v即反射方向,因此它代表观察者无论从哪个视角去看,看到物体的效果和颜色都是一样的。这是正确的,因为漫反射就是表现光向四面八方的反射。
 在现实中,光是有属性的,即光的颜色值(一个三维向量)。而现实中的物体也是有材质的,比如金属和木头的反射效果就截然不同,因此我们会给物体设置一个材质属性,表示它自身材质对光的相互作用,这里我们介绍了kd表示物体材质对光漫反射强度的一个度量,而材质中还有很多其它的度量。

http://www.lryc.cn/news/68141.html

相关文章:

  • AndroidAuto 解决PCTS NF7
  • GPT:你知道这五年我怎么过的么?
  • Python一行命令搭建HTTP服务器并外网访问 - 内网穿透
  • TypeScript5-泛型
  • IMX6ULL裸机篇之DDR3的时钟配置
  • PBDB Data Service:Specimens and measurements(标本和测量)
  • Zookeeper(一)
  • Maven(五):Maven的使用——依赖的测试
  • 超级独角兽 Databricks 的崛起之路
  • python 3.8 + tensorflow 2.4.0 + cuda11.0 的问题
  • 华为杯”研究生数学建模竞赛2021 年中国研究生数学建模竞赛 E 题: 信号干扰下的超宽带(UWB)精确定位问题-参考思路
  • Java 中的访问修饰符有什么区别?
  • Go基础篇:接口
  • 边缘计算:数字时代的新战场
  • PBDB Data Service:Fossil occurrences(化石产出记录)
  • 虾皮Shopee商品详情接口(item_get-根据ID取商品详情)代码封装
  • 原生js手动实现一个多级树状菜单效果(高度可过渡变化) + 模拟el-menu组件实现(简单版)
  • RK3568平台开发系列讲解(Linux内存篇)Linux内存管理框架
  • 你的编程能力从什么时候开始突飞猛进?
  • 滨州高企认定条件
  • Azkaban学习——单机版安装与部署
  • table标签-移动端适配
  • Yolov8改进---注意力机制:DoubleAttention、SKAttention,SENet进阶版本
  • 【逆向工程核心原理:TLS回调函数】
  • “Shell“Awk命令
  • 射频放大器的原理和作用(射频放大器和功率放大器的区别)
  • 揭秘KubeEdge边缘网络项目EdgeMesh:如何打造高速、安全、低延迟的互联网连接
  • Java设计模式 14-访问者模式
  • 【数据结构】线性表之链表
  • 微服架构基础设施环境平台搭建 -(四)在Kubernetes集群基础上搭建Kubesphere平台