US3S8L1——立方体纹理
US3S8L1——立方体纹理 立方体纹理 立方体纹理(CubeMap)是一种特殊的纹理类型,和之前我们讲过的单张纹理、法线纹理、渐变纹理、高光遮罩纹理不同, 立方体纹理包含6个独立的二维纹理,分别对应一个立方体的六个面,分别为: 正X面(右):+X 负X面(左):-X 正Y面(上):+Y 负Y面(下):-Y 正Z面(前):+Z 负Z面(后):-Z 注意:这个轴向就是 Unity 中的世界坐标轴向 立方体纹理的用途 立方体纹理(CubeMap)在图形编程中常见的用途有: 环境映射 用于模拟反射环境的效果,用立方体纹理存储周围环境的图像,当应用到反射表面时,可以让物体看起来像是在反射其周围的环境。 天空盒 用于渲染天空盒,将立方体纹理的六个面映射到一个立方体内表面,从而模拟天空、云朵、远处的山脉等环境 全景图 用于展示全景图像、视频,通过立方体纹理来存储全景照片、视频的六个部分 等等 立方体纹理如何采样 作为有 6 张 2D...
US3S8——高级纹理
US3S8——高级纹理 高级纹理 高级纹理指的是除一般的2D贴图纹理以外的特别纹理,包括立方体纹理、渲染目标纹理和程序纹理 他们可以实现很多高级效果,例如反射、折射等等,也可以实现透明,我们还可以使用程序生成纹理 本系列学习内容 立方体纹理 天空盒 动态生成立方体纹理 反射 折射 菲涅尔反射 渲染目标纹理 镜面效果 玻璃效果 程序纹理 C#代码动态生成程序纹理 Shader代码动态生成程序纹理 程序材质
US3S7L2——标准高光反射Shader
US3S7L2——标准高光反射Shader 标准高光反射Shader 和 标准漫反射Shader 一样,所谓的标准高光反射Shader,其实就是一个常用的高光反射 Shader 而已 该 Shader 其实就是一个带有法线(世界空间中计算-全局效果的表现更准确)的基于 BlinnPhong 光照模型的支持多光源和阴影的 Shader 制作常用高光反射Shader 新建一个 Shader,取名叫 BumpedSpecular(凹凸镜面反射) 复用 世界空间下计算法线纹理贴图的 中 Shader 代码,粘贴到新建文件中 具体代码,详见:US3S2L7——世界空间下计算法线纹理贴图 加入渲染标签 Tags { "RenderType"="Opaque" "Queue"="Geometry"} 渲染类型设置为不透明的、渲染队列设置为几何队列(不透明的几何体通常使用该队列) 12345SubShader{ Tags {...
US3S7L1——标准漫反射Shader
US3S7L1——标准漫反射Shader 标准漫反射Shader 目前我们已经完成了光源和阴影的主要知识点学习,包括多光源、阴影、光照衰减等等知识 已经可以在 Shader 中处理光和阴影相关的效果了,那么我们将结合所学的知识实现一个标准的漫反射 Shader 该 Shader 其实就是一个带有法线(世界空间中计算,因为全局效果的表现更准确,详见:US3S2L7——世界空间下计算法线纹理贴图) 的基于 Phong 光照模型(去掉高光反射)的支持多光源和阴影的Shader 说是标准,其实就是一个常用 Shader 而已 制作常用漫反射Shader 新建一个 Shader,取名叫 BumpedDiffuse(凹凸漫反射) 复用 世界空间下计算法线纹理贴图的 中 Shader 代码,粘贴到新建文件中 具体代码,详见:US3S2L7——世界空间下计算法线纹理贴图 加入渲染标签 Tags { "RenderType"="Opaque"...
US3S6L8——透明度混合物体阴影实现
US3S6L8——透明度混合物体阴影实现 知识回顾 透明度测试只能处理极端效果(完全透明和完全不透明) 而透明度混合可以帮助我们实现半透明效果 它的基本原理:关闭深度写入,开启混合,让片元颜色和颜色缓冲区中颜色进行混合计算 相关内容详见:US3S3L5——透明度混合 透明度混合 Shader 处理阴影 复用之前实现的透明混合 Shader,具体内容详见:US3S3L5——透明度混合、US3S3L6——开启深度写入的半透明 根据 透明度测试实现阴影接收和投射 的思路,如果想要物体产生阴影效果无非就两步: 投射阴影:在 FallBack 中关联内置的对应 Shader("Transparent/VertexLit") 1Fallback "Tranparent/VertexLit" 接受阴影:在 Shader 中书写计算阴影衰减值的相关代码 因此对于透明度混合的 Shader 也会使用同样的思路去制作 但是!由于透明度混合需要关闭深度写入,而阴影相关的处理需要用到深度值参与计算 因此 Unity...
US3S6L7——透明度测试物体阴影实现
US3S6L7——透明度测试物体阴影实现 知识回顾 在游戏开发中,要让对象的某些部位完全透明而其他部位完全不透明,就会使用透明测试 这种透明需求往往不需要半透明效果,相对比较极端,只有看得见和看不见之分,比如树叶、草、栅栏等等 透明度测试基本原理:通过一个阈值来决定哪些像素应该被保留,哪些应该被丢弃 相关内容详见:US3S3L4——透明度测试 让透明度测试 Shader 投射阴影 复用之前实现的透明测试 Shader 具体内容详见:US3S3L4——透明度测试 同样使用 FallBack 的形式投射阴影 但是需要注意的是,这里 FallBack 的内容为:Transparent/Cutout/VertexLit 该默认 Shader 中会把裁剪后的物体深度信息写入到 阴影映射纹理和摄像机深度图中 注意:使用该默认 Shader 计算投射阴影时,需要使用 _Cutoff 属性 和 _Color 属性来进行相关计算 因此我们必须保证我们的 Shader 当中有名字为 _Cutoff 的阈值属性 和 _Color...
US3S6L6——光照衰减和阴影
US3S6L6——光照衰减和阴影 知识回顾 多种光源的效果实现 在 Additional Pass(附加渲染通道)中根据光源类型,计算出不同的光源衰减值,参与到最终的颜色计算中 计算阴影时需要使用的三剑客 SHADOW_COORDS(阴影坐标宏) 在 v2f 结构体中声明,本质是声明了一个表示阴影映射纹理坐标的变量 TRANSFER_SHADOW(转移阴影宏) 在顶点着色器中调用,本质是将顶点进行坐标转换并存储到 _ShadowCoord 阴影纹理坐标变量中 SHADOW_ATTENUATION(阴影衰减宏) 本质是利用 _ShadowCoord 对阴影映射纹理进行采用,将采样得到的深度值进行比较,以计算出一个 fixed3 的阴影衰减值 最终之所以能够接受阴影,主要就是因为利用了最终得到的阴影衰减值参与到了最终的颜色计算中 本章代码关键字 1UNITY_LIGHT_ATTENUATION //...
US3S6L4——让物体接收阴影
US3S6L4——让物体接收阴影 本章代码关键字 123SHADOW_COORDS // 阴影坐标宏,主要用于存储阴影纹理坐标TRANSFER_SHADOW // 转移阴影宏,计算阴影映射纹理坐标,它会在内部去进行计算,并存储到v2f结构体的SHADOW_COORDS(2)内部SHADOW_ATTENUATION // 阴影衰减宏,该宏会在内部利用v2f中的阴影纹理坐标变量(ShadowCoord)对相关纹理进行采样,计算阴影衰减值 让物体接收阴影的思路 目前我们已经能够让物体投射阴影了,所谓的投射阴影, 其实就是让物体参与到光源的阴影映射纹理计算中,最终才能影响其他物体在接收阴影时的采样结果 由此可见让物体接收阴影的主要思路,其实就是要从阴影隐射纹理中进行采样,然后将采样结果用于最终的颜色计算中 总体的流程就是: 在顶点着色器中进行顶点坐标转换(将顶点坐标 转换为...
US3S6L3——让物体投射阴影
US3S6L3——让物体投射阴影 感受 Fallback 的作用 我们新建一个材质球,将其的 Shader 设置为我们之前实现的多种光源综合实现 Shader 并将该材质球赋值给较大的立方体使用,我们会发现该立方体不再投射阴影也不再接受阴影,如下图 左边的立方体使用 Unity 的默认 Shader,既可以接受阴影和也可以投射阴影 右边的立法体使用之前实现的 多种光源综合实现 Shader,可以发现其既不接受阴影和也不投射阴影 不投射阴影的原因:该 Shader 中没有 LightMode 为 ShaderCaster 的 Pass,无法参与光源的阴影映射纹理的计算 不接收阴影的原因:该 Shader 并没有对阴影映射相关纹理进行采样,没有进行阴影相关颜色运算 我们之前学习理论知识时提到过,Unity 会寻找 LightMode 为 ShaderCaster 的 Pass 来进行处理, 如果该 Shader 没有该 Pass,会在它 FallBack 指定的 Shader 中寻找,直到找到为止 我们现在在该 Shader 最后加上...
US3S6L2——Unity中阴影的实现原理
US3S6L2——Unity中阴影的实现原理 Screen Space Shadow Mapping 技术 虽然上一篇提到了 Shadow Mapping 技术的原理,但是在 Unity 当中,使用的并不只是纯粹的 Shadow Mapping 技术 还会使用由微软研究院提出的 (首次提出是在2011年):Screen Space Shadow Mapping( SSSM ),翻译过来就是:屏幕空间阴影映射技术 它是基于 Shadow Mapping 技术的一种拓展和改进技术。 注意:并不是所有设备都支持 SSSM 技术! 在之后编写阴影相关 Shader 时,Unity 内部会帮助我们判断对应平台是否支持 不支持时会默认使用 Shadow Mapping 处理阴影 要理解SSSM(屏幕空间阴影映射技术)的原理,我们首先再来回顾一下 Shadow Mapping...