计算机图形学-GAMES101-7

news2024/12/28 20:57:13

引言

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

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

一、深度缓存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.coloradmin.cn/o/536835.html

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

相关文章

下载和安装appuploader

转载:下载和安装appuploader IOS开发工具官网地址 Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 最新版本已经优化了没支付688给apple的账号登录流程,无需再安装其他软件。…

DockerWeave容器跨机通信网络部署

Docker Weave网络部署 Weave在Docker主机之间实现Overlay网络,使用业界标准VXLAN封装,基于UDP传输,也可以加密传输。 Weave Net创建一个连接多个Docker主机的虚拟网络,类似于一个以太网交换机,所有的容器都连接到这上…

数组或结构体赋值时memcpy与直接赋值的效率比较

先上结论: 二者不一定谁快通常情况下,数组维度越大,使用memcpy效率更高数组维度越大,直接赋值耗时主体是循环耗时 Note: “等号赋值”被编译器翻译成一连串的MOV指令,而memcpy则是一个循环。“等号赋值”比…

05mysql---函数

目录 1:日期函数 2:字符函数 3:数值函数 4:流程函数 1:日期函数 select 函数(参数) 函数功能举例curdate()返回当前日期2023-05-17curtime()返回当前时间14:44:33now()返回当前日期和时间2023-05-17 14:44:33year(date)获取指定date的年份month(date)获取指定date的月份day…

【简介】限流

限流 为什么要限流限流算法单机限流计数器算法滑动窗口算法漏桶算法令牌桶算法 分布式限流配额算法 限流策略限流位置 为什么要限流 作为有追求的程序员,我们都希望自己的系统跑的飞快,但是速度再快,系统处理请求耗时也不可能为0&#xff0c…

线程池下载4K壁纸

学习记录 学习记录 一、目标 aHR0cHM6Ly9waWMubmV0Ymlhbi5jb20vDQo 拿到每张图片的href 和 标题,跳转到详情页进行图片下载地址的提取并请求实现图片本地下载 二、代码实现 """ CSDN: 抄代码抄错的小牛马 mailbox:yxhlhm2002163.com…

计算机毕业论文内容参考|基于java的房产营销系统的设计与实现

文章目录 导文摘要前言绪论课题背景课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于java的房产营销系统的设计与实现 摘要 当今社会,随着经济的快速发展和人们对生活品质的不断提高,房地产行业正在面临…

Java --- docker安装redis

目录 一、拉取redis容器镜像 二、新建目录 三、拷贝redis.conf文件模板进/app/redis目录 四、修改redis.conf文件 五、启动redis镜像服务 一、拉取redis容器镜像 docker pull redis:7.0.0 二、新建目录 mkdir -p /app/redis 三、拷贝redis.conf文件模板进/app/redis目录 cp …

Java面试(4)面向对象

文章目录 概念1. 面向对象和面向过程的区别2. 面向对象三大特征 类1. 接口和抽象类有什么共同点和区别?2. 深拷贝和浅拷贝区别了解吗?什么是引用拷贝?3. 内部类1. 内部类2. 内部类的优点3. 内部类有哪些应用场景4. 局部内部类和匿名内部类访问…

python 3.8 + tensorflow 2.4.0 + cuda11.0 的问题

版本匹配 🔗从源代码构建 | TensorFlow 报错:Could not load dynamic library ‘cupti64_110.dll’; dlerror: cupti64_110.dll not found 是因为我电脑中的 cuda 版本以前是 10,现在是 11.4 ,所以需要安装对应版本的 cudatoolk…

基于粒子群算法的微网经济优化调度——附Matalb代码

目录 摘要: 代码主要内容: 研究背景: 微电网模型: 粒子群算法: 运行结果: Matlab代码分享: 摘要: 提出了一种经济与环保相协调的微电网优化调度模型,针对光伏电池…

SAP入门到放弃系列之需求管理的基本要素

需求管理目标: 一般而言,生产计划(PP)的总体目标,特别是需求管理的总体目标是通过减少以下内容来更好地为客户服务: 补货提前期存货成本 需求管理的要素: 需求管理工作的主要要素广义上可分…

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

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

暴涨700w播放,星穹铁道恰饭频频登上B站爆款热榜!

B站作为现在年轻一代聚集的多元化社区,游戏内容则是社区内受众较为广泛的存在,而星铁作为面向年轻群体的回合制游戏,自然是赢得B站核心用户群体的青睐。 4月26日,暌违已久的手游《崩坏:星穹铁道》(后文简称…

【Java】平时开发中遇到的问题你是否遇到过?

文章目录 前言一、六类典型空指针问题1.1包装类型的空指针问题1.2 级联调用的空指针问题1.3 Equals方法左边的空指针问题1.4 ConcurrentHashMap 这样的容器不支持 Key,Value 为 null。1.5 集合,数组直接获取元素1.6 对象直接获取属性 二、日期YYYY格式设…

Linux和UNIX的关系及区别(详解)

UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中,UNIX 诞生于 20 世纪 60 年代末,Windows 诞生于 20 世纪 80 年代中期,Linux 诞生于 20 世纪 90 年代初,可以说 UNIX 是操作系统中的"老大哥&…

Fortinet FortiNAC RCE漏洞复现(CVE-2022-39952)

0x01 产品简介 FortiNAC(Network Access Control) 是Fortinet的一种零信任网络访问控制解决方案,可增强用户对企业网络上的物联网 (IoT) 设备的监控。NAC 是零信任网络访问安全模型的重要组成部分,在该模型中,IT 团队可以轻松了解正在访问网络…

低代码让开发变得不再复杂

文章目录 前言低代码 VS 传统开发为什么选择IVX?平台比对总结 前言 在数字化的时代背景下,企业都面临巨大的数字化转型的挑战。为了应对这样的挑战,企业软件开发工具和平台也在不断革新和发展。低代码开发平台随之应运而生,成为了…

面向对象编程与面向过程编程的区别

面向过程: 以坦克飞机大战为例,如果按面向过程的思路去书写代码,则需要按如下顺序进行编码: 游戏初始化确定一台坦克的位置绘制坦克确定多架飞机的位置绘制飞机为坦克设置上下左右四个转向为坦克添加按下键盘k键发射子弹为所有飞…

ATFX国际:国内成品油价格下调,国际油价仍维持震荡态势

ATFX国际:5月16日,发改委发布成品油价格下调通知,其中提到:国内汽、柴油价格每吨分别降低380元和365元。以上海地区为例,价格下调后,每吨汽油的售价为9255元,每吨柴油的价格为8225元。经计算&am…