GAME101-Lecture07学习

前言

今天主要讲shading(着色)。在讲着色前,要先讲图形中三角形出现遮挡问题的方法(深度缓存或缓冲)。

先采样再模糊错误:对信号的频谱进行翻译(在这期间会有频谱的混叠),采样就是对这个信号进行截断。此时会发现混叠的信号还是混叠的。

Lecture 07 Shading 1 (Illumination, Shading and 
Graphics Pipeline)哔哩哔哩bilibili

光栅化内容

画家算法

image-20240515142326687

先给远处的东西画好(做光栅化),然后再给近处的做。这样就可以得到一个处理了遮挡的结果的“画”。

例如画一个正方体,按照后、左、下、右、上、前的顺序画,就可以得到一个正方体。

但是如果画的顺序改一改,可能会出现不同的效果。这是因为左、下、右、上这几个面到我们眼睛的距离在我们看来都是差不多的(视点到面的距离,又叫“深度”)

image-20240515142424665

  • 需要深度排序(对于n个三角形为0(n log n))可以具有无法解析的深度顺序

因此实际中,不能用画家算法。

深度缓存(缓冲)

由于不能使用画家算法,因此引入深度缓存的算法。

概念

image-20240515142619909

  • 这是最终胜出的算法。

  • idea:

    存储当前最小值。

    每个样本的Z值(像素)需要一个额外的缓冲区用于深度值

    -帧缓冲存储器存储颜色值 ​ -深度缓冲区(z缓冲区)存储深度

  • 重要:为简单起见,我们假设Z总是正数 (较小的z->更近,较大的z->更远)

图形学中,在渲染成品的图像时,会额外生成一个深度图/深度缓存(只存任何一个像素他所看到的最浅的深度信息)

算法(做法)

image-20240515143326188

一开始我们认为所有记录深度的点都是无限远的。

image-20240515143429228

数字越小代表越近,近的会把远的遮挡。

复杂度

image-20240515143700551

  • 以不同的顺序画三角形?

  • 最重要的可见性算法:在所有GPU的硬件中实现

我们认为每个三角形中有常数个像素,然后又n个三角形,那么复杂度就是0(n)(个人认为这里就有点离谱了,算法的复杂度要是这么算的话,那就所有都是On了。。。。。不过闫老师补充了下一般一个三角形会覆盖100个左右的像素,那就也行)

假设不会出现两个不同的三角形在一个像素上有同样的深度(在图形学中,这些数字大多都是用浮点型来表示,这意味着总会有些误差,这也因此浮点型的判断相同十分困难,尤其时两个经过运算得来的浮点型更加不可能相同),紫色和红色三角形画的顺序不一样,结果也是一样的

知识回顾

image-20240515144717270

到目前为止,我们的学习到的内容:模型变换->坐标系变换->投影变换->视口变换->光栅化

image-20240515144931248

着色(Shading)

对不同的物体有不同的材质。

Blinn-Phong模型

Blinn-Phong反色模型是一款着色模型。

image-20240515151409991

  • 镜面高光

  • 漫反射

  • 环境照明

定义

image-20240515151557873

  • 在特定阴影点处反射到摄像机的计算机光

  • 输入: 观察者方向,v 表面法向,n 光的方向,I(为许多光的每一个) 表面参数(颜色、光泽度等)

image-20240515151740156

目前所说的着色不考虑物体的存在,先不考虑关系打在物体后环境的变化(即没有阴影),只看光找过来物体表面的情况。着色具有着色性。

漫反射(Diffuse Reflection)

image-20240515152143011

  • 光均匀地向各个方向散射

  • 所有观看方向的表面颜色相同

当一个光线会到达某个点,然后这个光线会被均匀的反射出去,这就叫漫反射。

能量的接收

image-20240515152224381

  • 但是接收到多少光(能量)呢? 一朗伯余弦定律

  • 立方体的顶面接受一定量的光

  • 60°旋转立方体的顶面拦截了一半的光线

  • 一般来说,单位面积的光与cos 0=l·n成正比(朗伯余弦定律

其实就是光通量。

此时就可以算出,这个着色点接收到的光的能量。

能量的发射

image-20240515153203920

假设一个点光源。任何时刻,点光源辐射到四面八方。

一个单位的距离上,光的强度为I。那么在距离为r时,强度为I/r2

光传播的能量和距离成反比。

此时就可以通过物体距点光源的距离,算出来点光源发送到该物体表面的光的能量。

漫反射的能量

image-20240515154037796

  • Ld:漫反射光

  • kd:传播系数(颜色)

  • (I/r2):能量到达阴影点

  • max(0,n·l):阴影点接收的能量

向量点乘(n·l)<0时,表示这个光线从下面打向了物体的表面,此时是没有任何物理意义的(也可以认为我们一般是不会考虑物体内部有光源向外的),因此不考虑。所以这里要用max。

这个shadingPoint是会吸收一部分的光/颜色,它会有一定的吸收率,我们就定义一个系数kd。

image-20240515154805217

总结

本节课讲的东西比起前面来说,难度直线下降!

今天主要讲着色,讲着色前补充了前面光栅化深度缓存的知识。

光栅化内容中,首先讲解了画家算法的思想。由于画家算法无法很好的满足计算机图形学的需求,因此引入深度缓存的概念。

  • 每个导出的图像都有一张对应的深度图,这个深度图记录着所有像素的深度信息。

  • 此外还讲了深度缓存算法的实现方法,其本质就是一个双重循环。

着色部分通过Blinn-Phong反色模型引入漫反射、高光等显示中光照的效果情况。

  • 主要讲了物体漫反射中,光的能量问题。

  • 着色点平面与光发现的角度可以得到着色点对光能量接收的情况。

  • 光源与物体的距离可以得到着色点处光能量的发射状况。

  • 通过光能量的接收和发射状况,我们就可以量化漫反射的能量。

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

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

相关文章

【ARMv8/v9 系统寄存器 5 -- ARMv8 Cache 控制寄存器 SCTRL_EL1 使用详细介绍】

关于ARM Cache 详细学习推荐专栏&#xff1a; 【ARM Cache 专栏】 【ARM ACE Bus 与 Cache 专栏】 文章目录 ARMv8/v9 Cache 设置寄存器ARMv8 指令 Cache 使能函数测试代码 ARMv8/v9 Cache 设置寄存器 关于寄存器SCTRL_EL1 的详细介绍见文章&#xff1a;【ARMv8/v9 异常模型入…

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

【计算机毕业设计】springboot二手家电管理平台

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;二手家电管理平台当然不能排除在外。二手家电管理平台是在实际应用和 软件工程的开发原理之上&#xff0c;运用java语言以及前台VUE框架&#xf…

【操作系统期末速成】​内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;操作系统&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下&#xff1a;你闭上眼睛&#xff0c;脑海中构思一个场景&#xff0c;用简短的语言描述出来&#xff0c;然后“啪”的一声&#xff0c;一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节&#xff0c;而是Stable Diffusion——一种前沿的AI图片生成算法—…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低&#xff0c;硬件简单&#xff0c;数据格式灵活&#xff1b; 低速全双工异步串行通信 1.2 UART数据帧格式&#xff1f; 起始位&#xff08;1&#xff09;&#xff0b;数据位&#xff08;5-8&#xff09; 校验位…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

走进开源,拥抱开源

走进开源&#xff0c;拥抱开源 一、开源文化1.1 什么是开源1.2 为什么要开源1.3 有哪些开源协议 二、选择开源2.1 开源社区的类型与特点2.2 如何选择开源社区2.3 如何选择开源项目 三、参与开源3.1 开源社区的参与方式3.2 开源项目的参与方式 四、Apache Doris 参与示例4.1 Dor…