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()...
US3S8L10——程序纹理
US3S8L10——程序纹理 程序纹理 程序纹理(Procedural Textures),顾名思义,就是通过程序代码生成的纹理 我们之前学习的大部分纹理,一般都是美术同学提前制作好的图片 比如:颜色纹理、法线纹理、渐变纹理、高光遮罩纹理等等 就算是在高级纹理中学习的立方体纹理、渲染纹理,他们也是根据摄像机看到的内容生成的 而程序纹理是由我们程序员编写代码,动态生成的纹理图片,它的可控性和自由度,都远远大于我们之前学习的其他纹理相关内容 程序纹理如何生成 一般生成程序纹理由两种方式: 通过 C# 脚本生成纹理后传递给 Shader 直接在 Shader 代码中自定义逻辑生成纹理 后面会分别使用这两种方式,以动态生成国际象棋棋盘格为例 程序纹理的好处 程序纹理由于是由我们程序员写代码动态生成的,因此它具备以下优点: 由于是动态生成,不需要存储大文件,可以在运行时生成任意分辨率的纹理 可以根据需求调整自定义参数,实时的更改纹理外观 通过适当的函数设计,可以生成无缝平铺的纹理 总体而言,程序纹理的最明显好处就是自由度高,可控性强
US3S8L9——玻璃效果
US3S8L9——玻璃效果 玻璃效果 玻璃效果基本原理 根据我们目前学习的知识,想要实现玻璃效果,可能会联想到使用透明相关知识来进行制作。 虽然透明固然可以制作出玻璃透明的效果,但是它在许多地方有所缺陷,比如: 透明无法表现出复杂的光学效果 玻璃不仅仅是透明的,它还具有反射、折射等光学效果,使用透明无法简单的实现这些效果 透明物体往往会遇到深度排序问题 渲染顺序不正确时,会导致视觉错误 等等 因此我们想要实现效果更好的玻璃效果时,往往不会选择使用透明来制作 因此我们将使用渲染纹理来制作玻璃效果,基本原理是: 在渲染玻璃效果物体之前,先获取到当前屏幕图像,将当前屏幕图像存储在渲染纹理之中, 之后在真正处理玻璃效果物体时,再 利用该渲染纹理 来实现 透明、折射 等等效果, 该过程中并不会使用混合相关知识,而是直接进行颜色相乘或相加来进行颜色叠加 也就是说,这里的透明效果本质上是通过把 物体遮挡后边的屏幕内容的部分...
US3S8L8——镜面效果
US3S8L8——镜面效果 镜面效果原理 镜面效果的原理,就是将摄像机看到的画面渲染到渲染纹理当中,再在Shader中利用该渲染纹理进行翻转渲染即可 镜面效果准备工作 创建测试场景 创建一个摄像机用来得到镜子看到的画面 创建 Custom Render Texture 将其和摄像机关联 自定义渲染纹理参数 Custom Render Texture(CRT)是在 Unity 5.4 版本引入的一种特殊类型的 Render Texture。 它不仅继承了 Render Texture 的所有特性,还增加了额外的功能,例如时间轴控制和空间更新模式。 关于 Custom Render Texture,详情可见:自定义渲染纹理 - Unity 手册 Dimension:渲染纹理的维度 2D:2D 纹理 2D:2D 数组纹理 Cube:立方体纹理 3D:3D纹理 Size:像素尺寸 Anti-aliasing:抗锯齿效果,级别越高,抗锯齿效果越好 Enable Compatible...
US3S8L7——渲染目标纹理
US3S8L7——渲染目标纹理 渲染目标纹理 渲染目标纹理(Render Target Texture)是一种特殊类型的纹理, 一般摄像机的渲染结果会输出到颜色缓冲区中,最终渲染到设备屏幕上,让玩家通过屏幕看见游戏画面 而渲染目标纹理允许我们将渲染结果直接写入到某一张纹理中 我们可以利用这个纹理来处理各种特殊效果,比如:镜子、玻璃、屏幕后处理、阴影映射等等 在 Unity 中,渲染目标纹理(Render Target Texture)通常和渲染纹理(Render Texture)可以互换使用,指的相同的概念。 在实际使用中,我们更常听到的是"渲染纹理"这个术语 说人话:渲染纹理 就是 将渲染结果存储到一个纹理对象中,以便在后续的渲染步骤中使用 它的作用体现在:我们在进行 Shader 开发时,我们经常会希望某摄像机不要直接将结果渲染到屏幕上,而是可以得到它的渲染结果进行二次处理或利用 Unity 中的渲染目标纹理 获取渲染目标纹理的常用方法 渲染纹理(Render Texture 或 Custom Render Texture) Unity...
US3S8L6——菲涅尔反射
US3S8L6——菲涅尔反射 菲涅耳反射效果 菲涅耳反射是一种光学现象。简单的讲,就是视线垂直于观察表面时,反射较弱(更多的光会透射到进入新介质) 而当视线非垂直观察表面时,夹角越小,反射越明显。 真实世界中的例子: 如果你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈; 如果你看远处的湖面,你会发现水并不是透明的,但反射非常强烈,这就是“菲涅耳效应”。 菲涅耳反射原理是描述光在两种介质的界面上反射和折射的行为。反射和折射的强度取决于光的入射角和两种介质的折射率差异。 从物理角度来看,世界上所有物体在光线照射下都会遵循菲涅耳反射原理! 这意味着光在任何两种介质的界面上都会发生反射和折射,只不过具体反射效果会因为介质的性质和光的入射角度不同而有所变化。 无论是透明的、半透明的还是不透明的物体,只要有光线入射到其表面,菲涅耳反射都会发生。 在 Unity Shader 中,菲涅耳反射一般用来增强真实感,使物体表面在不同角度和光照条件下呈现出更加真实和自然的外观,增强视觉效果。 因为刚才我们提到真实世界中,万物皆遵循菲涅耳反射原理, 那么我们在游戏中使用...
US3S8L5——折射效果
US3S8L5——折射效果 本章代码关键字 1refract() // 折射向量计算 折射效果 折射效果指光的折射,是一种光学现象。指光从一种透明介质斜射入另一种透明介质时,传播方向一般会发生变化,这种现象叫光的折射。 光的折射与光的反射一样,都是发生在两种介质的交界处,只是反射光返回原介质中,而折射光进入到另一种介质中, 由于光在两种不同的物质里传播速度不同,故在两种介质的交界处传播方向发生变化,这就是光的折射。 在 Unity Shader 中,折射效果模拟了光线通过透明或半透明材质时的弯曲行为。 一般用来模拟水面、透明玻璃球、眼镜、钻石、水晶球、空气扰动等等效果,它一般会配合其他表现效果一起使用 折射效果的原理 折射效果的原理还是利用立方体纹理(CubeMap)进行环境映射 我们利用摄像机看向物体表面顶点的方向向量作为入射向量,结合顶点法线向量算出折射向量, 然后利用折射方向向量在立方体纹理中进行采样,得到最终反射的颜色。 简单来说,就是根据 视角方向 和...
US3S8L4——反射效果
US3S8L4——反射效果 本章代码关键字 123reflect() // 计算反射光线方法texCUBE() // 立方体纹理采样方法lerp() // 插值,在这里用于将光照效果和反射效果进行插值结合处理 反射效果 反射效果指光的反射,是一种光学现象。指光在两种物质分界面上改变传播方向又返回原来物质中的现象,就叫做光的反射。 比如:光遇到水面、玻璃、金属等许多物体的表面都会发生反射 在 Unity Shader 中,反射效果模拟了物体表面反射环境光的特性使得物体看起来像镜子或金属表面,能够反射周围环境的图像。 反射效果的原理 反射效果的原理就是利用立方体纹理(CubeMap 或 RenderTexture)进行环境映射 我们利用摄像机 看向物体表面顶点的方向向量 作为入射光,结合 顶点法线向量 可以算出反射向量 然后利用反射方向向量在立方体纹理中进行采样,得到最终反射的颜色。 简单来说,就是根据 视角方向 和...
US3S8L3——动态生成立方体纹理
US3S8L3——动态生成立方体纹理 本章代码关键字 123camera.RenderToCubemap() // 摄像机根据所在位置动态生成立方体纹理Cubemap // 立方体纹理类RenderTexture // 渲染纹理类,可以作为立方体纹理 为什么要动态生成立方体纹理? 立方体纹理 中提到过,立方体纹理的其中一个最大的作用就是环境映射, 在实现反射、折射等等效果时,需要用到立方体纹理来制作对应效果, 而立方体纹理中最重要的就是组成它的 6 张 2D 纹理图片 对于之前学过的天空盒来说,6 张 2D...