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 中搜索...
US3S8L11——Shader代码动态生成程序纹理
US3S8L11——Shader代码动态生成程序纹理 Shader代码动态生成程序纹理 本章使用知识点包括: 国际象棋棋盘格规则:格子的行列编号同奇同偶则为白色,不同则为黑色 数学知识回顾 两个奇数相加结果为偶数 两个偶数相加结果为偶数 一个奇数和一个偶数相加的结果是奇数 向下取整计算 Shader 中的内置函数 floor()(属于 UnityCG.cginc),该函数需要传入一个数值 floor(数值),会对传入数值向下取整 比如: floor(2.6) 返回 2 floor(0.4) 返回 0 floor(-2.3) 返回 -3 Shader 代码动态计算国际象棋棋盘格纹理 新建 Shader,删除无用代码 声明属性 平铺数量(行列数):_TileCount 格子颜色1:_Color1 格子颜色2:_Color2 123456Properties{ _TileCount("TileCount", Float) = 8 ...
US3S8L10——CSharp代码动态生成程序纹理
US3S8L10——CSharp代码动态生成程序纹理 C# 代码动态生成程序纹理 本章使用知识点包括: 利用 Unity 中 Texture2D 类生成纹理对象 利用 Renderer 类设置材质球纹理 利用 Unity 编辑器拓展知识自定义 Inspector 窗口,详见:UEDL7——Inspector窗口拓展 利用之前实现的单张纹理 Shader 用于测试,详见:US3S2L1——纹理颜色采样 C# 代码动态生成程序纹理相对较简单,我们只需要按需求用代码绘制纹理图片 在需要的时候更新程序纹理即可,更新纹理的时机可以根据需求来定,可以是在编辑模式下,可以是在运行时 修改贴图的某个像素的颜色并应用 设置像素的方法是 texture2D.SetPixel() 参数一:修改的像素所在的 x 轴值 参数二:修改的像素所在的 y 轴值 参数三:像素要修改成的颜色 1texture.SetPixel(x, y, color); 像素颜色修改后还需要使用 texture2D.Apply()...