计算机图形学-GAMES101-7

news/2024/10/17 18:18:36/

引言

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

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

一、深度缓存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.ppmy.cn/news/69831.html

相关文章

(2)数码管

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成"8"字器件 51单片机是共阴极连接 74HC245这个芯片有什么作用呢?解:这个芯片被称之为双向数据缓冲器这个芯片的作用,用来进行数据缓冲(提高驱…

java前端程序员职业生涯规划,我来分享一下升职加薪的六大技巧

今天给大家分享一下java前端程序员的职业生涯规划,我把它分成四个阶段。 第一个阶段是你还是一名在校大学生。这个时候一定要好好学习学校的专业技术知识,尤其是C语言、数据结构和算法。然后及时关注你身边名校的这些校园招聘机会,获得一些名…

tpm2-tools源码分析之tpm2_verifysignature.c(1)

TPM 2.0中的tpm2_verifysignature命令对应的源文件就是tpm2_verifysignature.c,该文件位于tpm2-tools/tools/下,一共有293行(版本5.5)。 tpm2_verifysignature的功能是使用TPM验证签名。使用加载的密钥验证带有传递给TPM的消息摘…

Spring Cloud Alibaba(二)Nacos统一配置管理

目录 一、为什么需要配置中心 二、常用的配置中心 Nacos 的几个概念 三、Nacos配置中心的使用 (一)properties格式 1、导入依赖 2、在配置中心新建配置 3、修改配置文件名为bootstrap.yml 4、在微服务中添加nacos config服务地址的配置 5、测试…

2013蓝桥杯真题省赛翻硬币 C语言/C++

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果…

【Python_Pandas】reset_index() 函数解析

【Python_Pandas】reset_index函数解析 文章目录 【Python_Pandas】reset_index函数解析1. 介绍2. 示例2.1 参数drop2.2 参数inplace2.3 参数level2.4 参数col_level2.5 参数col_fill 参考 1. 介绍 pandas.DataFrame.reset_index reset_index(levelNone, dropFalse, inplaceF…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-自动变道-1

书接上回 2.3.4.自动变道 当车辆处于导航引导模式NOA功能时(即车辆横向控制功能激活),且车速大于40km/h,驾驶员按下转向灯拨杆或系统判断当前有变道需要时,自动变道系统通过对车道线、自车道前方目标距离、邻近车道前后方目标距离等环境条件进行判断,在转向灯亮起3s后控…

Oracle_11g_RAC安装与配置for_Linux(2)

确认软件要求 LINUX发行版要求 Linux Distribution Requirements Asianux Distributions Asianux Server 3, Service Pack 2 (SP2) Oracle Linux Distributions Oracle Linux 4 Update 7, kernel 2.6.9 or laterOracle Linux 5 Update 2, kernel 2.6.18 or later (compatib…