US3S10L1——网格、网格渲染器、材质、着色器等之间的关系
US3S10L1——网格、网格渲染器、材质、着色器等之间的关系 网格(Mesh) 网格是一个 3D 对象的几何数据。它由顶点、边和面组成。网格描述了对象的形状和结构,定义了3D模型的轮廓。 网格中包含了模型的关键数据,比如:顶点、法线、切线、纹理坐标、顶点颜色、骨骼权重、骨骼索引、网格边界等等信息 例如,这个枪械模型下的 GunTwo,就是一个网格: 我们在 Shader 中使用的模型的数据就来自于 Mesh,其中: Unity 中不带骨骼动画的模型网格数据一般在 Mesh Filter(网格过滤器)组件中进行关联 带骨骼动画的模型网格数据一般在 Skinned Mesh Renderer(蒙皮网格渲染器)中进行关联 网格渲染器(Mesh Renderer) 网格渲染器是 Unity 中的一个组件,用于将网格绘制到屏幕上,它主要用来: 引用一个网格对象来获取几何数据 MeshRenderer 组件会自动寻找同一 GameObject 上 MeshFilter...
US3S10——屏幕后期处理效果
US3S10——屏幕后期处理效果 屏幕后期处理效果 屏幕后期处理效果(Screen Post-Processing Effects)是一种在渲染管线的最后阶段应用的视觉效果, 允许你在场景渲染完成后对最终图像进行各种调整和效果处理,从而增强视觉体验, 常见的屏幕后期处理效果有:景深、模糊、色彩调整 等等 说人话:屏幕后期处理效果就是当游戏画面渲染完毕后,通过获取到该画面信息进行额外的效果处理 注意!屏幕后处理的相关脚本一般需要挂载 Camera 对象上 本系列学习内容: 网格、网格渲染器、材质、着色器等之间的关系 C#代码修改材质参数 屏幕后处理基本实现原理 屏幕后处理基类 屏幕后处理效果 亮度、饱和度、对比度 边缘检测 高斯模糊 Bloom效果 运动模糊
US3S9L6——顶点动画的注意事项
US3S9L6——顶点动画的注意事项 顶点动画的注意事项 —— 批处理相关 在之前的顶点动画相关课程中一再强调,我们需要在渲染标签中添加 “DisableBatching”="True" 来让该 Shader 渲染的对象不进行批处理,目的是让基于模型空间的计算能够正确进行,不会影响最终的渲染结果 为什么批处理会影响顶点动画 Unity 中默认有静态批处理和动态批处理,批处理的主要作用是 合并多个对象,将他们作为一个 DrawCall 进行处理 之所以批处理会对顶点动画带来影响,是因为:不同的对象会拥有不同的变换矩阵(位置、旋转、缩放) 而批处理后,他们的变换矩阵会进行统一处理: 举例: 物体A:位于世界空间位置 (0, 0, 0),无旋转。 物体B:位于世界空间位置 (5, 0, 0),无旋转。 他们是两个独立的对象,拥有不同的变换矩阵,于是批处理与否带来的区别就是: 不进行批处理时: 每个对象的变换矩阵会单独传递给 Shader,顶点的模型空间位置会根据各自的变换进行正确计算 进行批处理时: 启用批处理后,Unity 会将对象 A 和对象 B...
US3S9L5——顶点根据摄像机位置移动——广告牌效果
US3S9L5——顶点根据摄像机位置移动——广告牌效果 广告牌效果 广告牌效果,它是一种图形技术,用于确保对象(通常是二维纹理面片或精灵(Sprite)图片)始终面向摄像机 同时在某些轴上保持固定的方向(一般分为全向广告牌和轴对齐广告牌) 在3D游戏中非常有用,它可以确保无论从哪个角度看、对象始终面向玩家,创造出一种始终可见的效果。 全向广告牌效果 即无论摄像机位置如何变化,对象在所有轴上始终面向摄像机 适用于烟雾、火焰等需要从任何角度看都要正对摄像机的效果 轴对齐广告牌效果 即对象在一个特定轴上保持固定方向,而在其他轴上面向摄像机, 适用于树木、花草、人物等需要在特定轴上保持正确方向的效果, 其中垂直广告牌就是一种特殊的轴对齐广告牌,对象在水平面(XZ平面)上旋转 但在垂直方向上始终保持不变 广告牌效果基本原理 想要实现广告牌效果,核心原理是:旋转模型空间坐标系让其始终面向摄像机 想要达到这个目的,我们需要构建一个基于模型空间的新坐标系: 坐标系由两个关键因素决定 原点(新坐标系中心点) 基于模型空间的,可以自定义,但一般还是用...
US3S9L4——顶点波动效果——流动的河流
US3S9L4——顶点波动效果——流动的河流 顶点波动可以达到的目标 假设我们的目标是让一个矩形网格面片,通过顶点动画,实现出河流的效果。 所谓的河流效果,就是呈现出波浪感,而想要呈现出波浪感,我们必须了解波长、波动频率、波动幅度这些关键因素 波浪感的关键因素 波长:指两个相邻波峰或波谷之间的距离。波长越大,波动越缓慢,波形周期越长。 波长的倒数:1波长\frac{1}{波长}波长1,倒数越大,表示波动越频繁,波形周期越短 波动频率:指波动在单位时间内发生的次数(相当于波浪变化的频率) 波动幅度:指波峰或波谷相对于中线(静止位置)的最大偏移位置 我们需要在我们的 Shader 代码中,声明这三个关键因素变量,用于控制顶点的偏移,从而实现流动的 2D 河流效果 波浪感基本原理 基本原理:让我们的顶点在对应的轴向产生偏移。 主要运用的就是 Shader 中的内置函数 sin(),以及内置时间变量 _Time.y sin() 是正弦函数,正弦函数是一个周期性函数,常用与表示波动和震荡效果,它的返回值是 -1 ~...
US3S9L3——滚动的背景
US3S9L3——滚动的背景 本章代码关键字 1frac() // 一般用于保留小数部分,但对负数使用会得到(1 - 小数部分) 获取小数部分 CG 内置函数 frac(参数),一般用于保留数值的小数部分,但是负数时要注意,会得到 (1 - 小数部分) 该函数的内部计算规则为:frac(x) = x - floor(x),比如: frac(2.5) = 2.5 - 2 = 0.5 frac(3.75) = 3.75 - 3 = 0.75 frac(-0.25) = -0.25 - (-1) = 0.75 frac(-3.75) = -3.75 - (-4) = 0.25 它的主要作用是可以帮助我们保证 uv 坐标 范围在 0~1 之间,相当于 大于 1 的 uv 值重新从 0 开始向 1 方向取值 小于 0 的 uv 值重新从 1 开始向 0 方向取值 分析利用纹理坐标制作滚动的背景的原理 注意点:滚动的背景使用的美术资源图片,往往是首尾循环相连的 基本原理:不停地利用时间变量对 uv 坐标进行偏移运算,超过 1 的部分从 0...
US3S9L2——序列帧动画
US3S9L2——序列帧动画 分析利用纹理坐标制作序列帧动画的原理 Shader实现序列帧动画的关键点是:UV 坐标原点为左下角,而序列帧图集 “原点” 为左上角 我们需要注意采样开始位置的转换 以下图为例,制作一个序列帧爆炸动画(不需要使用 Unity 的 Sprite Editor 去分割图集): 关键点 UV 坐标范围 0~1,原点为图片左下角 图集序列帧动画播放顺序为从左到右,从上到下 分析问题 如何得到当前应该播放哪一帧动画? 如何将采样规则从 0~1 修改为在指定范围内采样? 问题解决思路 用内置时间参数 _Time.y 参与计算得到具体哪一帧 时间是不停增长的数值,用它对总帧数取余,便可以循环获取到当前帧数 利用时间得到当前应该绘制哪一帧后 我们只需要确认从当前小图片中,采样开始位置,采样范围即可, 采样开始位置,可以利用当前帧和行列一起计算,采样范围可以将 0~1 范围 缩放转换到 小图范围内 我们按照顺序,从左到右,从上到下的选定不同小图的范围,改变 UV...
US3S9L1——如何制作动态效果
US3S9L1——如何制作动态效果 如何利用 Shader 制作动态效果 让画面动起来是因为每一帧对象的位置、角度、缩放、颜色等等信息的改变后重新渲染带来的 相当于就是间隔一定时间更新一些数据,从而带来了画面变化, 那么想要利用 Shader 制作出动态效果,其实原理也是一样的,我们只需要间隔一定时间改变Shader中的数据, 从而改变渲染的结果,最终达到画面变化的目的,这样就能够带来动态感了。 Shader 中的内置时间变量 利用 Shader 制作动态效果的关键就是 —— 利用时间变化来改变数据,从而导致渲染结果改变,带来画面变化 其中,时间是关键数据,Shader 中提供了对应的内置时间变量: float4 _Time 4 个分量的值分别是 (t/20, t, 2t, 3t),其中t代表该游戏场景从加载开始缩经过的时间 float4 _SinTime 4 个分量的值分别是 (t/8, t/4, t/2, t),其中 t 代表 游戏运行的时间的正弦值 float4 _CosTime 4 个分量的值分别是 (t/8, t/4, t/2,...
US3S9——动态效果
US3S9——动态效果 动态效果 游戏画面中为什么能看到动态效果 主要的原因是因为 游戏循环 机制,即游戏画面每隔一个固定时间(每一帧)就会重新渲染 游戏运行时,每一帧都会更新屏幕,这种更新频率通常称为 帧率(Frames Per Second,FPS) 比如 30 FPS、60 FPS 代表的就是 1 秒钟更新 30 次,1 秒钟更新 60 次 而之所以看起来画面是变化的,是因为我们在每一帧可能都会改变游戏中对象的位置、角度、缩放、颜色等等信息后重新渲染 一般情况下,只要帧率大于 24 FPS,人眼就认为一帧帧切换着的画面是流畅且连贯的了 让画面动起来是因为每一帧对象的位置、角度、缩放、颜色等等信息的改变后重新渲染带来的 相当于就是间隔一定时间更新一些数据,从而带来了画面变化, 那么想要利用 Shader 制作出动态效果,其实原理也是一样的, 我们只需要间隔一定时间改变Shader中的数据,从而改变渲染的结果, 最终达到画面变化的目的,这样就能够带来动态感了。 总结:利用 Shader 制作动态效果的关键就是 ——...
US3S8L12——程序材质
US3S8L12——程序材质 程序材质 程序材质是通过算法和数学函数生成的材质(主要在 Shader 代码中实现) 它通常包括多个纹理属性和各种其他属性,用于计算模拟现实世界中的各种表面特性 总的来说,程序材质是由多个程序纹理和材质属性组合而成的 他们共同定义了材质的外观和物理属性,模拟出复杂的表现效果 制作程序材质的工具 常见的制作程序材质的美术工具有: Substance Designer(物质设计师) Blender Houdini 等等 其中 Substance Designer 是一个使用非常广泛的的程序材质创建工具,在游戏开发、电影制作、建筑可视化、虚拟现实领域都很常用 通过它制作的程序纹理不仅可以在各种游戏引擎(Unity、UE等)中使用,还可以在其他领域使用 因此我们在此主要讲解如何使用由 Substance Designer 制作的程序材质 Unity 中使用程序材质 Substance Designer 制作的程序材质后缀为 .sbsar 文件 Unity 中并不能直接使用 .sbsar 后缀的程序材质,我们需要在 Asset Store 中搜索...