求助 使用unity5 后 出现unity shader time问题

开通极客学院VIP会员,免费观看全部会员课程
最低 21.6 元 / 月
VIP会员尊享特权
观看全部会员课程
720P高清视频下载
已有会员账号,请
视频太卡?试试切换线路
本课时是本套课程的基本概要,其中包括:课程的知识准备与课程的安排,Shader 着色器的基本概念,以及 Unity5 新推出的 Physical-Based Shader
本课时主要介绍了在开始学习图形处理系统之前必要的知识准备以及整个图形处理系统的知识体系与课程安排
本课时主要从使用层面和概念层面向大家介绍了 Shader 的相关基本知识
本课时主要向大家介绍了几种常用的 Shader 类型,以及相关用途,并针对 Unity5 与 Unity4 的 Shader 进行了对比
本课时用过从原理以及使用两个方便向大家介绍了 Unity5 新推出的Physical-Based Shader 基于物理的标准着色器
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
Shader Forge 官网链接
添加新技术问题
课程 [Shader 的基本概念]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [Shader 的基本概念]热销排行榜
1.2.3.4.5.6.7.8.9.10.
最近浏览的其他商品
浏览更多同类商品
【 】??????????
Unity Shader入门精要
978-7-115-42305-4
人民邮电出版社
出版日期:
读者对象:
¥49.70&&&
立刻节省:¥19.30
现在有货,10本以上
所属分类:
业内专家撰写,业界专家罗盛誉(风宇冲)和宣雨松(MOMO)鼎力推荐的目前Unity Shader学习的绝佳参考书相比与国内市场已有的介绍相关内容的书籍和资料来说,本书有一些独有的特色:(1)内容独特。填补了Unity Shader和渲染流水线之间的知识鸿沟,对Unity中一些渲染机制的工作原理进行详细剖析,帮助读者解决“是什么”“为什么”“怎么做”这三个基本问题。本书配合大量实例,来让读者在实践中逐渐掌握Unity Shader的编写。(2)结构连贯。在内容编排上破费心思,从基础到进阶再到深入,解决读者长期以来的学习烦恼。(3)充分面向初学者。在本书的编写过程中,我们一直在问自己,这么写到底读者能不能看懂?为此,提供了大量的图示配合以文字说明,并在一些章节后提供了“答疑解惑”小节来解释那些含糊不清而初学者又经常疑问的问题。(4)包含了Unity 5在渲染方面的新内容。如多次介绍Unity 5中的新工具帧调试器(Frame Debugger),并借助该工具的帮助来理解Unity中的渲染过程。(5)补充了大量延伸阅读资料。在本书一些章节后提供了“扩展阅读”小节,让那些希望更加深入学习某个方向的读者可以在提供的资料中找到更多的学习内容。
内 容 提 要本书不仅要教会读者如何使用Unity Shader,更重要的是要帮助读者学习Unity中的一些渲染机制以及如何使用Unity Shader实现各种自定义的渲染效果,希望这本书可以为读者打开一扇新的大门,让读者离制作心目中杰出游戏的心愿更近一步。本书的主要内容为:第1章讲解了学习Unity Shader应该从哪里着手;第2章讲解了现代GPU是如何实现整个渲染流水线的,这对理解Shader的工作原理有着非常重要的作用;第3章讲解Unity Shader的实现原理和基本语法;第4章学习Shader所需的数学知识,帮助读者克服学习Unity Shader时遇到的数学障碍;第5章通过实现一个简单的顶点/片元着色器案例,讲解常用的辅助技巧等;第6章学习如何在Shader中实现基本的光照模型;第7章讲述了如何在Unity Shader中使用法线纹理、遮罩纹理等基础纹理;第8章学习如何实现透明度测试和透明度混合等透明效果;第9章讲解复杂的光照实现;第10章讲解在Unity Shader中使用立方体纹理、渲染纹理和程序纹理等高级纹理;第11章学习用Shader实现纹理动画、顶点动画等动态效果;第12章讲解了屏幕后处理效果的屏幕特效;第13章使用深度纹理和法线纹理实现更多屏幕特效;第14章讲解非真实感渲染的算法,如卡通渲染、素描风格的渲染等;第15章讲解噪声在游戏渲染中的应用;第16章介绍了常见的优化技巧;第17章介绍用表面着色器实现渲染;第18章讲解基于物理渲染的技术;第19章讲解在升级Unity 5时可能出现的问题,并给出解决方法;第20章介绍许多非常有价值的学习资料,以帮助读者进行更深入的学习。本书适合Unity初学者、游戏开发者、程序员,也可以作为大专院校相关专业师生的学习用书,以及培训学校的培训教材。
一只喜欢计算机图形的程序媛。上海交通大学软件学院研究生,爱好写shader,喜欢一切用计算机绘画的技术。
目录第1篇 基础篇第1章 欢迎来到Shader的世界 21.1 程序员的三大浪漫 21.2 本书结构 3第2章 渲染流水线 52.1 综述 52.1.1 什么是流水线 52.1.2 什么是渲染流水线 62.2 CPU和GPU之间的通信 72.2.1 把数据加载到显存中 72.2.2 设置渲染状态 82.2.3 调用Draw Call 82.3 GPU流水线 92.3.1 概述 92.3.2 顶点着色器 102.3.3 裁剪 112.3.4 屏幕映射 112.3.5 三角形设置 122.3.6 三角形遍历 132.3.7 片元着色器 132.3.8 逐片元操作 142.3.9 总结 172.4 一些容易困惑的地方 182.4.1 什么是OpenGL/DirectX 182.4.2 什么是HLSL、GLSL、CG 192.4.3 什么是Draw Call 202.4.4 什么是固定管线渲染 222.5 那么,你明白什么是Shader了吗 232.6 扩展阅读 23第3章 Unity Shader基础 243.1 Unity Shader概述 253.1.1 一对好兄弟:材质和Unity Shader 253.1.2 Unity中的材质 263.1.3 Unity中的Shader 263.2 Unity Shader的基础:ShaderLab 283.3 Unity Shader的结构 293.3.1 给我们的Shader起个名字 293.3.2 材质和Unity Shader的桥梁:Properties 293.3.3 重量级成员:SubShader 313.3.4 留一条后路:Fallback 333.3.5 ShaderLab还有其他的语义吗 333.4 Unity Shader的形式 333.4.1 Unity的宠儿:表面着色器 343.4.2 最聪明的孩子:顶点/片元着色器 353.4.3 被抛弃的角落:固定函数着色器 353.4.4 选择哪种Unity Shader形式 363.5 本书使用的Unity Shader形式 363.6 答疑解惑 363.6.1 Unity Shader != 真正的Shader 363.6.2 Unity Shader和CG/HLSL之间的关系 373.6.3 我可以使用GLSL来写吗 383.7 扩展阅读 38第4章 学习Shader所需的数学基础 394.1 背景:农场游戏 394.2 笛卡儿坐标系 404.2.1 二维笛卡儿坐标系 404.2.2 三维笛卡儿坐标系 414.2.3 左手坐标系和右手坐标系 424.2.4 Unity使用的坐标系 444.2.5 练习题 454.3 点和矢量 454.3.1 点和矢量的区别 464.3.2 矢量运算 474.3.3 练习题 534.4 矩阵 544.4.1 矩阵的定义 544.4.2 和矢量联系起来 554.4.3 矩阵运算 554.4.4 特殊的矩阵 574.4.5 行矩阵还是列矩阵 604.4.6 练习题 614.5 矩阵的几何意义:变换 624.5.1 什么是变换 624.5.2 齐次坐标 634.5.3 分解基础变换矩阵 634.5.4 平移矩阵 644.5.5 缩放矩阵 644.5.6 旋转矩阵 654.5.7 复合变换 664.6 坐标空间 674.6.1 为什么要使用这么多不同的坐标空间 684.6.2 坐标空间的变换 684.6.3 顶点的坐标空间变换过程 724.6.4 模型空间 734.6.5 世界空间 734.6.6 观察空间 754.6.7 裁剪空间 774.6.8 屏幕空间 834.6.9 总结 854.7 法线变换 864.8 Unity Shader的内置变量(数学篇) 874.8.1 变换矩阵 874.8.2 摄像机和屏幕参数 884.9 答疑解惑 894.9.1 使用3×3还是4×4的变换矩阵 894.9.2 CG中的矢量和矩阵类型 894.9.3 Unity中的屏幕坐标:ComputeScreenPos/VPOS/WPOS 904.10 扩展阅读 934.11 练习题答案 93第2篇 初级篇第5章 开始Unity Shader学习之旅 1005.1 本书使用的软件和环境 1005.2 一个最简单的顶点/片元着色器 1005.2.1 顶点/片元着色器的基本结构 1015.2.2 模型数据从哪里来 1035.2.3 顶点着色器和片元着色器之间如何通信 1045.2.4 如何使用属性 1055.3 强大的援手:Unity提供的内置文件和变量 1075.3.1 内置的包含文件 1075.3.2 内置的变量 1095.4 Unity提供的CG/HLSL语义 1095.4.1 什么是语义 1095.4.2 Unity支持的语义 1105.4.3 如何定义复杂的变量类型 1105.5 程序员的烦恼:Debug 1115.5.1 使用假彩色图像 1115.5.2 利用神器:Visual Studio 1135.5.3 最新利器:帧调试器 1135.6 小心:渲染平台的差异 1155.6.1 渲染纹理的坐标差异 1155.6.2 Shader的语法差异 1165.6.3 Shader的语义差异 1175.6.4 其他平台差异 1175.7 Shader整洁之道 1175.7.1 float、half还是fixed 1175.7.2 规范语法 1185.7.3 避免不必要的计算 1185.7.4 慎用分支和循环语句 1195.7.5 不要除以0 1195.8 扩展阅读 120第6章 Unity中的基础光照 1216.1 我们是如何看到这个世界的 1216.1.1 光源 1216.1.2 吸收和散射 1226.1.3 着色 1226.1.4 BRDF光照模型 1236.2 标准光照模型 1236.2.1 环境光 1236.2.2 自发光 1246.2.3 漫反射 1246.2.4 高光反射 1246.2.5 逐像素还是逐顶点 1256.2.6 总结 1256.3 Unity中的环境光和自发光 1266.4 在Unity Shader中实现漫反射光照模型 1266.4.1 实践:逐顶点光照 1266.4.2 实践:逐像素光照 1296.4.3 半兰伯特模型 1306.5 在Unity Shader中实现高光反射光照模型 1316.5.1 实践:逐顶点光照 1326.5.2 实践:逐像素光照 1346.5.3 Blinn-Phong光照模型 1356.6 召唤神龙:使用Unity内置的函数 136第7章 基础纹理 1397.1 单张纹理 1407.1.1 实践 1407.1.2 纹理的属性 1427.2 凹凸映射 1467.2.1 高度纹理 1467.2.2 法线纹理 1467.2.3 实践 1487.2.4 Unity中的法线纹理类型 1547.3 渐变纹理 1557.4 遮罩纹理 1587.4.1 实践 1597.4.2 其他遮罩纹理 161第8章 透明效果 1628.1 为什么渲染顺序很重要 1638.2 Unity Shader的渲染顺序 1648.3 透明度测试 1658.4 透明度混合 1698.5 开启深度写入的半透明效果 1718.6 ShaderLab的混合命令 1738.6.1 混合等式和参数 1738.6.2 混合操作 1748.6.3 常见的混合类型 1758.7 双面渲染的透明效果 1768.7.1 透明度测试的双面渲染 1768.7.2 透明度混合的双面渲染 176第3篇 中级篇第9章 更复杂的光照 1809.1 Unity的渲染路径 1809.1.1 前向渲染路径 1829.1.2 顶点照明渲染路径 1859.1.3 延迟渲染路径 1869.1.4 选择哪种渲染路径 1889.2 Unity的光源类型 1889.2.1 光源类型有什么影响 1899.2.2 在前向渲染中处理不同的光源类型 1909.3 Unity的光照衰减 1959.3.1 用于光照衰减的纹理 1969.3.2 使用数学公式计算衰减 1969.4 Unity的阴影 1969.4.1 阴影是如何实现的 1979.4.2 不透明物体的阴影 1989.4.3 使用帧调试器查看阴影绘制过程 2029.4.4 统一管理光照衰减和阴影 2049.4.5 透明度物体的阴影 2069.5 本书使用的标准Unity Shader 209第10章 高级纹理 21010.1 立方体纹理 21010.1.1 天空盒子 21010.1.2 创建用于环境映射的立方体 纹理 21210.1.3 反射 21310.1.4 折射 21510.1.5 菲涅耳反射 21710.2 渲染纹理 21910.2.1 镜子效果 21910.2.2 玻璃效果 22010.2.3 渲染纹理 vs. GrabPass 22410.3 程序纹理 22510.3.1 在Unity中实现简单的程序 纹理 22510.3.2 Unity的程序材质 228第11章 让画面动起来 23011.1 Unity Shader中的内置变量 (时间篇) 23011.2 纹理动画 23011.2.1 序列帧动画 23011.2.2 滚动的背景 23311.3 顶点动画 23411.3.1 流动的河流 23411.3.2 广告牌 23611.3.3 注意事项 239第4篇 高级篇第12章 屏幕后处理效果 24412.1 建立一个基本的屏幕后处理脚本 系统 24412.2 调整屏幕的亮度、饱和度和 对比度 24612.3 边缘检测 24912.3.1 什么是卷积 24912.3.2 常见的边缘检测算子 24912.3.3 实现 25012.4 高斯模糊 25312.4.1 高斯滤波 25312.4.2 实现 25412.5 Bloom效果 25912.6 运动模糊 26312.7 扩展阅读 266第13章 使用深度和法线纹理 26713.1 获取深度和法线纹理 26713.1.1 背后的原理 26713.1.2 如何获取 26913.1.3 查看深度和法线纹理 27113.2 再谈运动模糊 27213.3 全局雾效 27613.3.1 重建世界坐标 27613.3.2 雾的计算 27813.3.3 实现 27813.4 再谈边缘检测 28313.5 扩展阅读 287第14章 非真实感渲染 28814.1 卡通风格的渲染 28814.1.1 渲染轮廓线 28814.1.2 添加高光 28914.1.3 实现 29014.2 素描风格的渲染 29314.3 扩展阅读 29614.4 参考文献 297第15章 使用噪声 29815.1 消融效果 29815.2 水波效果 30215.3 再谈全局雾效 30515.4 扩展阅读 30915.5 参考文献 309第16章 Unity中的渲染优化技术 31016.1 移动平台的特点 31016.2 影响性能的因素 31116.3 Unity中的渲染分析工具 31216.3.1 认识Unity 5的渲染统计
很好的一本书 去寻找1991&&&&&日
目前看到第4章空间变换,觉得有必要来赞扬下。说实话空间变换这个网上资料很多,谁都扯一扯,但是说明白的很少,这本来是一本说unity shader的书,但是在空间变换这里却说得非常好,模型空间-世界空...内容灰常丰富的工具书 ChipsNova&&&&&日虽然是本工具书,但是里面包含许多基础知识和可以下去了解的内容介绍。 相比UnityshaderCookBook那本只贴出一堆效果实现方式,这本书更加让读者受益,每个实现背后的原理都有简单的解释。 初学者甚至可以拿来当图...妹子作者不简单 Esfog&&&&&日本书出版前就在关注,当时知道作者是个92年出生,还没毕业的妹子研究生。也没有抱太大希望。第一时间买到后翻了翻放在一旁,最近才找时间看完了,收货很大.书的结构非常合理,注重理论联系实际,作者理论知识较足,...
客服专线:010- 客服邮箱:
Copyright & 北发图书网 2007,
All Rights Reserved
北京北发电子商务股份有限公司 版权所有【浅墨Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)&屏幕水幕特效的实现
时间: 20:54:33
本系列文章由@浅墨_毛星云&出品,转载请注明出处。&& 文章链接:&http://blog.csdn.net/poem_qianmo/article/details/ 作者:毛星云(浅墨)&& &微博:/u/
本文工程使用的Unity3D版本:&5.2.1&&&概要:本文主要介绍了Unity5中的标准着色器,并且也涉及到了基于物理的着色、延迟渲染等高级着色技术,而在文章后半部分,也对屏幕水幕特效的实现方法进行了讲解与分析。&依然是附上一组本文配套工程的运行截图之后,便开始我们的正文。如下图。&打开水幕特效的效果图:&&原始的城镇场景:&&需要说明,这里的水幕特效是动态的效果。本来准备传GIF上来展示动态的效果,但受图片尺寸2M的限制,无法出色地表现出动态效果(帧数有限,图片清晰度也会大打折扣)。建议感兴趣的朋友们下载这里提供的游戏场景的exe,自己在机器上体验水幕效果,比看博文中贴出的图片效果好太多。&【可运行的本文配套exe游戏场景请点击这里下载】&提示:在此游戏场景中按F键可以开关屏幕特效。&在文章末尾有更多的运行截图,并提供了源工程的下载。&好的,正文开始。&&&一、认识Unity5中的Standard Shader &Unity5中重点推出了一套基于物理的着色(Physically Based Shading,PBS)的多功能Shader,叫做标准着色器(Standard Shader)。这套Shader的设计初衷是化繁为简。想用这样的一个多功能Shader,来代替之前多种多样的Shader各司其职,对于不同的材质效果,需要不同的Shader的局面。&Unity 5中目前有两个标准着色器,一个名为Stardard,我们称它为标准着色器的标准版,另一个名为Stardard(Specular Setup),我们称它为标准着色器的高光版,它们共同组成了一个完整的PBS光照明模型,且非常易于使用。标准着色器主要是针对表面(也就是建筑材质)而设计的,可以处理大多数现实世界的材质,例如石头、陶瓷、、银器或橡胶等。同时,它也可以非常出色地处理一些非硬质表面的材质,例如皮肤、头发或布料等。&如下的一个Unity官方放出的名为VikingVillage的场景中,所有的物体材质都是使用的标准着色器,标准着色器的广泛适用性可见一斑。&&而在Unity5的官方放出的演示demo视频中,也是用一个标准着色器,Stardard(Specular Setup),就完成了游戏场景中绝大多数物体的材质显示。Unity5 Standard Shader的演示Demo可以看这里:/w_19rquxac31.html&Unity5 PBS技术的演示Demo截图:下面稍微对Standard shader中核心的概念——基于物理的着色做一个大概的了解。&1.1 基于物理的着色(Physically Based Shading)技术概览&&基于物理的着色(Physically Based Shading,简称PBS)就是以某种方式模拟现实中材质和光照的相互作用的一种着色方法。这种方法在需要光照和材质更加直观和逼真地协同工作的场合下优势非常明显。基于物理的着色模拟了光线在现实中的行为,实现了在不同的光照条件下的逼真效果。为实现这种效果需要遵循各种物理原理,包括能量(也就是物体反射出去的光量不可能超过所接收的光量),Fresnel反射(所有表面反射在掠射角(grazing angles)处更加强烈),以及物体表面是如何自我遮挡等原理。其实,PBS技术在多年前于虚幻三游戏引擎中就已经被广泛使用,而Unity直到最近刚发布的第五代,才将此特性作为官方的特性实现出来。而在Unity5发布之前,Unity的Asset Store中,已经有不少的第三方插件,在Unity中实现了PBS技术。&关于PBS技术,知乎上有一个专栏,专门介绍PBS技术的一些相关原理,在这里推荐一下:&基于物理着色(一)基于物理着色(二)- Microfacet材质和多层材质基于物理着色(三)- Disney和UE4的实现这边贴一张专栏中的配套渲染图,效果非常出色:&&&1.2 如何使用标准着色器&可以在Unity5中任意材质的Shader选项中的最前面看到两个Standard Shader字样的选项。其中第一个是普通版,第二个带Specularsetup是高光版。&标准着色器标准版材质界面:&标准着色器的高光版材质界面:&不难得知,标准着色器引入了新的材质编辑器,它使PBS的材质编辑工作比以前的非PBS材质更简单。新的编辑器不但简洁,还提供了材质的所有可能用到的选项。在新编辑器中,我们不需要选用不同的着色器来改变纹理通道;不会再出现 “texture unused, please choose another shader” 这样的提示;也不再需要通过切换着色器来改变混合模式。所有的纹理通道都是备选的,无需强制使用,任何一个闲置通道的相关代码都会在编译时被优化掉,因此完全不用担心效率方面的问题。unity会根据我们输入到编辑器中的数据来生成正确的代码,并使整个过程保持高效。&另外,我们可以用ctrl+点击纹理的方式预览大图,并且还可以分别查看颜色和Alpha通道。ctrl+点击纹理,得到的纹理放大的预览:&OK,关于Unity5中的StandardShader的概念,大概先就讲这么多。更多细节可以参考Unity官方文档:/Manual/shader-StandardShader.html&以及这里Unity5 Standard Shader的官方文档论坛翻:http://forum./thread-897-1-1.html&&&&1.3 理解标准着色器的组成上面说了很多标准着色器的强大之处,其实,作为一个着色器,它也没有什么神秘的地方,无非就是两个Shader源文件,加上一堆CG头文件组成的两个功能稍微复杂全面一些的Shader而已。其中,两个Shader源文件里,又按渲染路径分为了很多的SubShader,每个SubShader里面又分为了很多Pass。而CG文件中,主要包含了Shader的支持函数,相关的宏等为Shader源文件提供支持的代码。&Unity5中标准着色器的组成,归纳概括如下:&两个Shader源文件七个CG头文件一个脚本文件(用于自定义材质编辑器UI)&下面分别对每个文件进行一个简单的介绍。&1)两个Shader源文件Stardard.shader着色器源文件 - 标准着色器的标准版StardardSpecular.shader着色器源文件 - 标准着色器的高光版&2)七个CG头文件UnityStandardBRDF.cginc头文件-用于存放标准着色器处理BRDF材质属性相关的函数与宏UnityStandardConfig.cginc头文件-用于存放标准着色器配置相关的代码(其实里面就几个宏)UnityStandardCore.cginc头文件-用于存放标准着色器的主要代码(如顶点着色函数、片段着色函数等相关函数)UnityStandardInput.cginc头文件-用于存放标准着色器输入结构相关的工具函数与宏UnityStandardMeta.cginc头文件-用于存放标准着色器meta通道中会用到的工具函数与宏UnityStandardShadow.cginc头文件-用于存放标准着色器阴影贴图采样相关的工具函数与宏UnityStandardUtils.cginc头文件-用于存放标准着色器共用的一些工具函数&&在包括本文在内的接下来的几次更新中,本系列文章将试着花篇幅来剖析这两个Shader源文件,和依附的几个CG头文件的源码,从而一窥Unity5中新版Shader书写体系的究竟。&&3)一个脚本文件StandardShaderGUI.cs脚本文件——定义了特定的自定义编辑器UI界面标准着色器对应材质的编辑器外观不同于一般的Shader,就是因为在Shader末尾书写了如下的代码:&&//使用特定的自定义编辑器UI界面
CustomEditor &StandardShaderGUI&&标准着色器对应材质的编辑器外观如下:&&&一般的着色器对应材质的编辑器外观如下:&&&&二、Unity5标准着色器源代码剖析之一:架构分析篇上文已经提到过,标准着色器源代码的剖析是一个小小的马拉松,完全解析起来篇幅会很长,所以本系列文章将对剖析的过程进行连载,此节为连载的第一部分。&在这里先贴出经过浅墨详细注释的标准着色器标准版的源代码,并对架构进行简单的分析,而对每个通道的剖析在稍后的更新中会进行。&//-----------------------------------------------【Shader说明】---------------------------------------------------
Unity5.2.1 Built-in Standard Shader
2015年10月
Commented by
更多内容或交流,请访问浅墨的博客:http://blog.csdn.net/poem_qianmo
//---------------------------------------------------------------------------------------------------------------------
Shader &Standard&
//------------------------------------【属性值】------------------------------------
Properties
_Color(&Color&, Color) = (1,1,1,1)
_MainTex(&Albedo&, 2D) = &white& {}
//Alpha剔除值
_Cutoff(&Alpha Cutoff&, Range(0.0, 1.0)) = 0.5
//平滑、光泽度
_Glossiness(&Smoothness&, Range(0.0, 1.0)) = 0.5
[Gamma] _Metallic(&Metallic&, Range(0.0, 1.0)) = 0.0
//金属光泽纹理图
_MetallicGlossMap(&Metallic&, 2D) = &white& {}
//凹凸的尺度
_BumpScale(&Scale&, Float) = 1.0
//法线贴图
_BumpMap(&Normal Map&, 2D) = &bump& {}
//高度缩放尺度
_Parallax (&Height Scale&, Range (0.005, 0.08)) = 0.02
//高度纹理图
_ParallaxMap (&Height Map&, 2D) = &black& {}
//遮挡强度
_OcclusionStrength(&Strength&, Range(0.0, 1.0)) = 1.0
//遮挡纹理图
_OcclusionMap(&Occlusion&, 2D) = &white& {}
//自发光颜色
_EmissionColor(&Color&, Color) = (0,0,0)
//自发光纹理图
_EmissionMap(&Emission&, 2D) = &white& {}
//细节掩膜图
_DetailMask(&Detail Mask&, 2D) = &white& {}
//细节纹理图
_DetailAlbedoMap(&Detail Albedo x2&, 2D) = &grey& {}
//细节法线贴图尺度
_DetailNormalMapScale(&Scale&, Float) = 1.0
//细节法线贴图
_DetailNormalMap(&Normal Map&, 2D) = &bump& {}
//二级纹理的UV设置
[Enum(UV0,0,UV1,1)] _UVSec (&UV Set for secondary textures&, Float) = 0
//混合状态的定义
[HideInInspector] _Mode (&__mode&, Float) = 0.0
[HideInInspector] _SrcBlend (&__src&, Float) = 1.0
[HideInInspector] _DstBlend (&__dst&, Float) = 0.0
[HideInInspector] _ZWrite (&__zw&, Float) = 1.0
//===========开始CG着色器语言编写模块===========
//BRDF相关的一个宏
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
//===========结束CG着色器语言编写模块===========
//------------------------------------【子着色器1】------------------------------------
// 此子着色器用于Shader Model 3.0
//----------------------------------------------------------------------------------------
//渲染类型设置:不透明
Tags { &RenderType&=&Opaque& &PerformanceChecks&=&False& }
//细节层次设为:300
//--------------------------------通道1-------------------------------
// 正向基础渲染通道(Base forward pass)
// 处理方向光,自发光,光照贴图等 ...
//设置通道名称
Name &FORWARD&
//于通道标签中设置光照模型为ForwardBase,正向渲染基础通道
Tags { &LightMode& = &ForwardBase& }
//混合操作:源混合乘以目标混合
Blend [_SrcBlend] [_DstBlend]
// 根据_ZWrite参数,设置深度写入模式开关与否
ZWrite [_ZWrite]
//===========开启CG着色器语言编写模块===========
//着色器编译目标:Model 3.0
#pragma target 3.0
//编译指令:不使用GLES渲染器编译
#pragma exclude_renderers gles
// ---------编译指令:着色器编译多样化--------
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP
//--------着色器编译多样化快捷指令------------
//编译指令:编译正向渲染基础通道(用于正向渲染中,应用环境光照、主方向光照和顶点/球面调和光照)所需的所有变体。
//这些变体用于处理不同的光照贴图类型、主要方向光源的阴影选项的开关与否
#pragma multi_compile_fwdbase
//编译指令:编译几个不同变种来处理不同类型的雾效(关闭/线性/指数/二阶指数/)
#pragma multi_compile_fog
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardBase
#pragma fragment fragForwardBase
//包含辅助CG头文件
#include &UnityStandardCore.cginc&
//===========结束CG着色器语言编写模块===========
//--------------------------------通道2-------------------------------
// 正向附加渲染通道(Additive forward pass)
// 以每个光照一个通道的方式应用附加的逐像素光照
//设置通道名称
Name &FORWARD_DELTA&
//于通道标签中设置光照模型为ForwardAdd,正向渲染附加通道
Tags { &LightMode& = &ForwardAdd& }
//混合操作:源混合乘以1
Blend [_SrcBlend] One
//附加通道中的雾效应该为黑色
Fog { Color (0,0,0,0) }
//关闭深度写入模式
ZWrite Off
//设置深度测试模式:小于等于
ZTest LEqual
//===========开启CG着色器语言编写模块===========
//着色器编译目标:Model 3.0
#pragma target 3.0
//编译指令:不使用GLES渲染器编译
#pragma exclude_renderers gles
// ---------编译指令:着色器编译多样化--------
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP
//--------使用Unity内置的着色器编译多样化快捷指令------------
//编译指令:编译正向渲染基础通道所需的所有变体,但同时为上述通道的处理赋予了光照实时阴影的能力。
#pragma multi_compile_fwdadd_fullshadows
//编译指令:编译几个不同变种来处理不同类型的雾效(关闭/线性/指数/二阶指数/)
#pragma multi_compile_fog
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardAdd
#pragma fragment fragForwardAdd
//包含辅助CG头文件
#include &UnityStandardCore.cginc&
//===========结束CG着色器语言编写模块===========
// --------------------------------通道3-------------------------------
阴影渲染通道(Shadow Caster pass)
将将物体的深度渲染到阴影贴图或深度纹理中
//设置通道名称
Name &ShadowCaster&
//于通道标签中设置光照模型为ShadowCaster。
//此光照模型代表着将物体的深度渲染到阴影贴图或深度纹理。
Tags { &LightMode& = &ShadowCaster& }
//开启深入写入模式
//设置深度测试模式:小于等于
ZTest LEqual
//===========开启CG着色器语言编写模块===========
//着色器编译目标:Model 3.0
#pragma target 3.0
//编译指令:不使用GLES渲染器编译
#pragma exclude_renderers gles
// ---------编译指令:着色器编译多样化--------
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
//--------着色器编译多样化快捷指令------------
//进行阴影投射相关的多着色器变体的编译
#pragma multi_compile_shadowcaster
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster
//包含辅助CG头文件
#include &UnityStandardShadow.cginc&
//===========结束CG着色器语言编写模块===========
// --------------------------------通道4-------------------------------
延迟渲染通道(Deferred Render Pass)
//设置通道名称
Name &DEFERRED&
//于通道标签中设置光照模型为Deferred,延迟渲染通道
Tags { &LightMode& = &Deferred& }
#pragma target 3.0
// TEMPORARY: GLES2.0 temporarily disabled to prevent errors spam on devices without textureCubeLodEXT
#pragma exclude_renderers nomrt gles
//---------编译指令:着色器编译多样化(shader_feature)--------
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP
//---------编译指令:着色器编译多样化(multi_compile)--------
#pragma multi_compile ___ UNITY_HDR_ON
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
#pragma multi_compile DIRLIGHTMAP_OFF DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
#pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertDeferred
#pragma fragment fragDeferred
//包含辅助CG头文件
#include &UnityStandardCore.cginc&
//===========结束CG着色器语言编写模块===========
// --------------------------------通道5-------------------------------
//元通道(Meta Pass)
//为全局光照(GI),光照贴图等技术提取相关参数,如(emission, albedo等参数值)
//此通道并不在常规的渲染过程中使用
//设置通道名称
Name &META&
//于通道标签中设置光照模型为Meta
//(截止日,Unity 5.2.1的官方文档中并没有收录此光照模型,应该是Unity官方的)
Tags { &LightMode&=&Meta& }
//关闭剔除操作
//===========开启CG着色器语言编写模块===========
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert_meta
#pragma fragment frag_meta
//---------编译指令:着色器编译多样化--------
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
//包含辅助CG头文件
#include &UnityStandardMeta.cginc&
//===========结束CG着色器语言编写模块===========
//------------------------------------【子着色器2】-----------------------------------
// 此子着色器用于Shader Model 2.0
//----------------------------------------------------------------------------------------
//渲染类型设置:不透明
Tags { &RenderType&=&Opaque& &PerformanceChecks&=&False& }
//细节层次设为:150
//--------------------------------通道1-------------------------------
// 正向基础渲染通道(Base forward pass)
// 处理方向光,自发光,光照贴图等 ...
//设置通道名称
Name &FORWARD&
//于通道标签中设置光照模型为ForwardBase,正向渲染基础通道
Tags { &LightMode& = &ForwardBase& }
//混合操作:源混合乘以目标混合,即结果为两者的混合
Blend [_SrcBlend] [_DstBlend]
// 根据_ZWrite参数,设置深度写入模式开关与否
ZWrite [_ZWrite]
//===========开启CG着色器语言编写模块===========
//着色器编译目标:Model 2.0
#pragma target 2.0
// ---------编译指令:着色器编译多样化--------
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
//跳过如下变体的编译,简化编译过程
#pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
//--------着色器编译多样化快捷指令------------
#pragma multi_compile_fwdbase
#pragma multi_compile_fog
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardBase
#pragma fragment fragForwardBase
//包含辅助CG头文件
#include &UnityStandardCore.cginc&
//===========结束CG着色器语言编写模块===========
//--------------------------------通道2-------------------------------
// 正向附加渲染通道(Additive forward pass)
// 以每个光照一个通道的方式应用附加的逐像素光照
//设置通道名称
Name &FORWARD_DELTA&
//于通道标签中设置光照模型为ForwardAdd,正向渲染附加通道
Tags { &LightMode& = &ForwardAdd& }
//混合操作:源混合乘以1
Blend [_SrcBlend] One
//附加通道中的雾效应该为黑色
Fog { Color (0,0,0,0) }
//关闭深度写入模式
ZWrite Off
//设置深度测试模式:小于等于
ZTest LEqual
//===========开启CG着色器语言编写模块===========
//着色器编译目标:Model 2.0
#pragma target 2.0
// ---------编译指令:着色器编译多样化--------
#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
//跳过一些变体的编译
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
#pragma skip_variants SHADOWS_SOFT
//--------使用Unity内置的着色器编译多样化快捷指令------------
//编译指令:编译正向渲染基础通道所需的所有变体,但同时为上述通道的处理赋予了光照实时阴影的能力。
#pragma multi_compile_fwdadd_fullshadows
//编译指令:编译几个不同变种来处理不同类型的雾效(关闭/线性/指数/二阶指数/)
#pragma multi_compile_fog
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertForwardAdd
#pragma fragment fragForwardAdd
//包含辅助CG头文件
#include &UnityStandardCore.cginc&
//===========结束CG着色器语言编写模块===========
// --------------------------------通道3-------------------------------
阴影渲染通道(Shadow Caster pass)
将将物体的深度渲染到阴影贴图或深度纹理中
//设置通道名称
Name &ShadowCaster&
//于通道标签中设置光照模型为ShadowCaster。
//此光照模型代表着将物体的深度渲染到阴影贴图或深度纹理。
Tags { &LightMode& = &ShadowCaster& }
//开启深入写入模式
//设置深度测试模式:小于等于
ZTest LEqual
//===========开启CG着色器语言编写模块===========
//着色器编译目标:Model 2.0
#pragma target 2.0
//---------编译指令:着色器编译多样化(shader_feature)--------
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
//编译指令:跳过某些变体的编译
#pragma skip_variants SHADOWS_SOFT
//快捷编译指令:进行阴影投射相关的多着色器变体的编译
#pragma multi_compile_shadowcaster
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster
//包含辅助CG头文件
#include &UnityStandardShadow.cginc&
//===========结束CG着色器语言编写模块===========
// --------------------------------通道4-------------------------------
//元通道(Meta Pass)
//为全局光照(GI),光照贴图等技术提取相关参数,如(emission, albedo等参数值)
//此通道并不在常规的渲染过程中使用
//设置通道名称
Name &META&
//于通道标签中设置光照模型为Meta
//(截止日,Unity 5.2.1的官方文档中并没有收录此光照模型,应该是Unity官方的疏漏)
Tags { &LightMode&=&Meta& }
//关闭剔除操作
//===========开启CG着色器语言编写模块===========
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert_meta
#pragma fragment frag_meta
//---------编译指令:着色器编译多样化--------
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
//包含辅助CG头文件
#include &UnityStandardMeta.cginc&
//===========结束CG着色器语言编写模块===========
//回退Shader为顶点光照Shader
FallBack &VertexLit&
//使用特定的自定义编辑器UI界面
CustomEditor &StandardShaderGUI&
&标准着色器的源代码部分相对于着色器的体量来说,算是有点长的,加上注释后有近500行。先稍微把它的架构稍微理一下。标准着色器由两个SubShader组成。第一个SubShader用于处理Shader Model 3.0,有5个通道,第二个SubShader用于处理Shader Model 2.0, 有4个通道,详细的架构如下图:&OK,标准着色器的架构大致如上。今天就先讲这么多,上面代码的稍微有些看不懂没关系,从下次更新开始,就将深入到每个Pass的顶点和片段着色器函数之中,逐行注释与分析他们的指令细节。&而不难发现,标准着色器代码的第一个SubShader比第二个SubShader多出了一个延迟渲染通道(Deferred Render Pass),下面稍微提一下延迟渲染的基本概念。&&&&三、关于延迟渲染(Deferred Render)看过《GPU Gems2》的朋友们应该都有所了解,延迟渲染(Deferred Render,又称Deferred Shading)是次时代引擎必备的渲染方式之一。&延迟渲染,一言以蔽之,就是将光照/渲染的计算延迟到第二步进行,避免多次渲染同一个像素,从而减少多余的计算操作,以提高渲染效率的一种先进的渲染方式。&延迟渲染最大的优势是可以实现同屏中数量众多的动态光源(十几到几十个),这在传统的渲染管线中是很难实现的。&更多延迟渲染的细节,这边不细说,只是提供一些链接,以作进一步了解延迟渲染的导论之用:https://zh.wikipedia.org/wiki/%E5%BB%B6%E6%9C%9F%E7%9D%80%E8%89%B2&http://blog.csdn.net/noslopforever/article/details/3951273&.cn/s/blog_458f.html&/lancidie/archive//2144748.html&http://blog.csdn.net/pizi0475/article/details/7932920/wangchengfeng/p/3440097.html&&&&四、屏幕水幕特效的实现&&在上一篇文章中有提到过,Unity中的屏幕特效通常分为两部分来实现:&Shader实现部分脚本实现部分&下面依然是从这两个方面对本次的特效进行实现。&而在这之前,需要准备好一张水滴(水滴太多了也就成了水幕了)的效果图片(google“water drop”一下,稍微筛选一下就有了,最好是能找到或者自己加工成无缝衔接的),放置于我们特效的脚本实现文件目录附加的一个Resources的文件夹中,那么我们在脚本中适当的地方写上一句:Texture2 = Resources.Load(&ScreenWaterDrop&)as Texture2D;&就可以读取到这张图片了。浅墨准备的图片如下(无水图片的可以在浅墨的Github中找到,或者直接下文章末尾的项目工程)。ScreenWaterDrop.png:&&&<span style="font-size:24color:# Shader实现部分&老规矩,先上详细注释的代码。//-----------------------------------------------【Shader脚本说明】---------------------------------------------------
屏幕水幕特效的实现代码-Shader脚本部分
2015年10月
Created by
更多内容或交流,请访问浅墨的博客:http://blog.csdn.net/poem_qianmo
//---------------------------------------------------------------------------------------------------------------------
Shader &浅墨Shader编程/Volume9/ScreenWaterDropEffect&
//------------------------------------【属性值】------------------------------------
Properties
_MainTex (&Base (RGB)&, 2D) = &white& {}
//屏幕水滴的素材图
_ScreenWaterDropTex (&Base (RGB)&, 2D) = &white& {}
//当前时间
_CurTime (&Time&, Range(0.0, 1.0)) = 1.0
//X坐标上的水滴尺寸
_SizeX (&SizeX&, Range(0.0, 1.0)) = 1.0
//Y坐标上的水滴尺寸
_SizeY (&SizeY&, Range(0.0, 1.0)) = 1.0
//水滴的流动速度
_DropSpeed (&Speed&, Range(0.0, 10.0)) = 1.0
_Distortion (&_Distortion&, Range(0.0, 1.0)) = 0.87
//------------------------------------【唯一的子着色器】------------------------------------
//设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)
ZTest Always
//===========开启CG着色器语言编写模块===========
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
//编译指令: 指定着色器编译目标为Shader Model 3.0
#pragma target 3.0
//包含辅助CG头文件
#include &UnityCG.cginc&
//外部变量的声明
uniform sampler2D _MainT
uniform sampler2D _ScreenWaterDropT
uniform float _CurT
uniform float _DropS
uniform float _SizeX;
uniform float _SizeY;
uniform float _D
uniform float2 _MainTex_TexelS
//顶点输入结构
struct vertexInput
float4 vertex : POSITION;//顶点位置
float4 color : COLOR;//颜色值
float2 texcoord : TEXCOORD0;//一级纹理坐标
//顶点输出结构
struct vertexOutput
half2 texcoord : TEXCOORD0;//一级纹理坐标
float4 vertex : SV_POSITION;//像素位置
fixed4 color : COLOR;//颜色值
//--------------------------------【顶点着色函数】-----------------------------
// 输入:顶点输入结构体
// 输出:顶点输出结构体
//---------------------------------------------------------------------------------
vertexOutput vert(vertexInput Input)
//【1】声明一个输出结构对象
vertexOutput O
//【2】填充此输出结构
//输出的顶点位置为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
Output.vertex = mul(UNITY_MATRIX_MVP, Input.vertex);
//输出的纹理坐标也就是输入的纹理坐标
Output.texcoord = Input.
//输出的颜色值也就是输入的颜色值
Output.color = Input.
//【3】返回此输出结构对象
//--------------------------------【片段着色函数】-----------------------------
// 输入:顶点输出结构体
// 输出:float4型的颜色值
//---------------------------------------------------------------------------------
fixed4 frag(vertexOutput Input) : COLOR
//【1】获取顶点的坐标值
float2 uv = Input.texcoord.
//【2】解决平台差异的问题。校正方向,若和规定方向相反,则将速度反向并加1
#if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y & 0)
_DropSpeed = 1 - _DropS
//【3】设置三层水流效果,按照一定的规律在水滴纹理上分别进行取样
float3 rainTex1 = tex2D(_ScreenWaterDropTex, float2(uv.x * 1.15* _SizeX, (uv.y* _SizeY *1.1) + _CurTime* _DropSpeed *0.15)).rgb / _D
float3 rainTex2 = tex2D(_ScreenWaterDropTex, float2(uv.x * 1.25* _SizeX - 0.1, (uv.y *_SizeY * 1.2) + _CurTime *_DropSpeed * 0.2)).rgb / _D
float3 rainTex3 = tex2D(_ScreenWaterDropTex, float2(uv.x* _SizeX *0.9, (uv.y *_SizeY * 1.25) + _CurTime * _DropSpeed* 0.032)).rgb / _D
//【4】整合三层水流效果的颜色信息,存于finalRainTex中
float2 finalRainTex = uv.xy - (rainTex1.xy - rainTex2.xy - rainTex3.xy) / 3;
//【5】按照finalRainTex的坐标信息,在主纹理上进行采样
float3 finalColor = tex2D(_MainTex, float2(finalRainTex.x, finalRainTex.y)).
//【6】返回加上alpha分量的最终颜色值
return fixed4(finalColor, 1.0);
//===========结束CG着色器语言编写模块===========
&屏幕特效Shader中真正有营养的核心代码,一般都是位于像素着色器中。也就是这里的frag函数中,稍微聊一聊。&第一步,先从顶点着色器输出结构体中获取顶点的坐标://【1】获取顶点的坐标值
float2 uv = Input.texcoord.第二步,因为需要水幕纹理在屏幕中从上向下滚动,而不同平台的原点位置是不同的,Direct3D原点在左上角,OpenGL原点在左下角。所以在这边需要对情况进行统一。统一的方法里用到了UNITY_UV_STARTS_AT_TOP宏,它是Unity中内置的宏,其值 取为1 或0 ; 在纹理 V 坐标在“纹理顶部”为零的平台上值取 1。如Direct3D;而OpenGL 平台上取 0。另外,这边还用到了MainTex_TexelSize变量。float2型的MainTex_TexelSize(其实是_TexelSize后缀,前面的名称会根据定义纹理变量的改变而改变)也是Unity中内置的一个变量,存放了纹理中单个像素的尺寸,也就是说,如果有一张2048 x 2048的纹理,那么x和y的取值都为1.0/2048.0。而且需要注意,当该纹理被Direct3D的抗锯齿操作垂直反转过后,xxx_TexelSize的值将为负数。&所以,第二步的代码就是如下://【2】解决平台差异的问题。校正方向,若和规定方向相反,则将速度反向并加1
#if UNITY_UV_STARTS_AT_TOP
if(_MainTex_TexelSize.y & 0)
_DropSpeed= 1 - _DropS
#endif&第三步,定义三层水流的纹理,按照不同的参数取值,进行采样: //【3】设置三层水流效果,按照一定的规律在水滴纹理上分别进行取样
float3 rainTex1 = tex2D(_ScreenWaterDropTex, float2(uv.x * 1.15* _SizeX, (uv.y* _SizeY*1.1) + _CurTime* _DropSpeed *0.15)).rgb / _D
float3 rainTex2 = tex2D(_ScreenWaterDropTex, float2(uv.x * 1.25* _SizeX - 0.1, (uv.y*_SizeY * 1.2) + _CurTime *_DropSpeed * 0.2)).rgb / _D
float3 rainTex3 = tex2D(_ScreenWaterDropTex, float2(uv.x* _SizeX *0.9, (uv.y *_SizeY *1.25) + _CurTime * _DropSpeed* 0.032)).rgb / _D第四步,整合一下三层水流效果的颜色信息,用一个float2型的变量存放下来://【4】整合三层水流效果的颜色信息,存于finalRainTex中
float2 finalRainTex = uv.xy - (rainTex1.xy - rainTex2.xy - rainTex3.xy) / 3;&第五步,自然是在屏幕所在的纹理_MainTex中进行一次最终的采样,算出最终结果颜色值,存放于float3型的finalColor中。//【5】按照finalRainTex的坐标信息,在主纹理上进行采样
float3 finalColor = tex2D(_MainTex, float2(finalRainTex.x, finalRainTex.y)).第六步,因为返回的是一个fixed4型的变量,rgba。所以需要给float3型的finalColor配上一个alpha分量,并返回://【6】返回加上alpha分量的最终颜色值return fixed4(finalColor, 1.0);&OK,关于此Shader的实现细节,差不多就需要讲到这些。下面再看一下C#脚本文件的实现。&&4.2 C#脚本实现部分&C#脚本文件的实现并没有什么好讲的,唯一的地方,水滴纹理的载入,上面已经提到过了,实现代码如下://载入素材图
ScreenWaterDropTex = Resources.Load(&ScreenWaterDrop&) asTexture2D; &下面就直接贴出详细注释的实现此特效的C#脚本:&//-----------------------------------------------【C#脚本说明】---------------------------------------------------
// 屏幕水幕特效的实现代码-C#脚本部分
2015年10月
Created by
更多内容或交流,请访问浅墨的博客:http://blog.csdn.net/poem_qianmo
//---------------------------------------------------------------------------------------------------------------------
using UnityE
using System.C
[ExecuteInEditMode]
[AddComponentMenu(&浅墨Shader编程/Volume9/ScreenWaterDropEffect&)]
public class ScreenWaterDropEffect : MonoBehaviour
//-------------------变量声明部分-------------------
#region Variables
//着色器和材质实例
public Shader CurS//着色器实例
private Material CurM//当前的材质
//时间变量和素材图的定义
private float TimeX = 1.0f;//时间变量
private Texture2D ScreenWaterDropT//屏幕水滴的素材图
//可以在编辑器中调整的参数值
[Range(5, 64), Tooltip(&溶解度&)]
public float Distortion = 8.0f;
[Range(0, 7), Tooltip(&水滴在X坐标上的尺寸&)]
public float SizeX = 1f;
[Range(0, 7), Tooltip(&水滴在Y坐标上的尺寸&)]
public float SizeY = 0.5f;
[Range(0, 10), Tooltip(&水滴的流动速度&)]
public float DropSpeed = 3.6f;
//用于参数调节的中间变量
public static float ChangeD
public static float ChangeSizeX;
public static float ChangeSizeY;
public static float ChangeDropS
#endregion
//-------------------------材质的get&set----------------------------
#region MaterialGetAndSet
Material material
if (CurMaterial == null)
CurMaterial = new Material(CurShader);
CurMaterial.hideFlags = HideFlags.HideAndDontS
return CurM
#endregion
//-----------------------------------------【Start()函数】---------------------------------------------
// 说明:此函数仅在Update函数第一次被调用前被调用
//--------------------------------------------------------------------------------------------------------
void Start()
//依次赋值
ChangeDistortion = D
ChangeSizeX = SizeX;
ChangeSizeY = SizeY;
ChangeDropSpeed = DropS
//载入素材图
ScreenWaterDropTex = Resources.Load(&ScreenWaterDrop&) as Texture2D;
//找到当前的Shader文件
CurShader = Shader.Find(&浅墨Shader编程/Volume9/ScreenWaterDropEffect&);
//判断是否支持屏幕特效
if (!SystemInfo.supportsImageEffects)
//-------------------------------------【OnRenderImage()函数】------------------------------------
// 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果
//--------------------------------------------------------------------------------------------------------
void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
//着色器实例不为空,就进行参数设置
if (CurShader != null)
//时间的变化
TimeX += Time.deltaT
//时间大于100,便置0,保证可以循环
if (TimeX & 100) TimeX = 0;
//设置Shader中其他的外部变量
material.SetFloat(&_CurTime&, TimeX);
material.SetFloat(&_Distortion&, Distortion);
material.SetFloat(&_SizeX&, SizeX);
material.SetFloat(&_SizeY&, SizeY);
material.SetFloat(&_DropSpeed&, DropSpeed);
material.SetTexture(&_ScreenWaterDropTex&, ScreenWaterDropTex);
//拷贝源纹理到目标渲染纹理,加上我们的材质效果
Graphics.Blit(sourceTexture, destTexture, material);
//着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的
//直接拷贝源纹理到目标渲染纹理
Graphics.Blit(sourceTexture, destTexture);
//-----------------------------------------【OnValidate()函数】--------------------------------------
// 说明:此函数在编辑器中该脚本的某个值发生了改变后被调用
//--------------------------------------------------------------------------------------------------------
void OnValidate()
ChangeDistortion = D
ChangeSizeX = SizeX;
ChangeSizeY = SizeY;
ChangeDropSpeed = DropS
//-----------------------------------------【Update()函数】------------------------------------------
// 说明:此函数在每一帧中都会被调用
//--------------------------------------------------------------------------------------------------------
void Update()
//若程序在运行,进行赋值
if (Application.isPlaying)
Distortion = ChangeD
SizeX = ChangeSizeX;
SizeY = ChangeSizeY;
DropSpeed = ChangeDropS
//找到对应的Shader文件,和纹理素材
#if UNITY_EDITOR
if (Application.isPlaying != true)
CurShader = Shader.Find(&浅墨Shader编程/Volume9/ScreenWaterDropEffect&);
ScreenWaterDropTex = Resources.Load(&ScreenWaterDrop&) as Texture2D;
//-----------------------------------------【OnDisable()函数】---------------------------------------
// 说明:当对象变为不可用或非激活状态时此函数便被调用
//--------------------------------------------------------------------------------------------------------
void OnDisable()
if (CurMaterial)
//立即销毁材质实例
DestroyImmediate(CurMaterial);
}OK,水幕屏幕特效实现部分大致就是这样,下面看一下运行效果的对比。&&&五、最终的效果展示&&贴几张场景的效果图和使用了屏幕特效后的效果图。在试玩场景时,除了类似CS/CF的FPS游戏控制系统以外,还可以使用键盘上的按键【F】,开启或者屏幕特效。本次的场景还是使用上次更新中放出的城镇,只是出生地点有所改变。为了有更多的时间专注于Shader书写本身,以后的博文配套场景采取不定期大更新的形式(两次、三次一换)。&城镇野外(with 屏幕水幕特效):城镇野外(原始图):上(with 屏幕水幕特效):山坡上(原始图):城镇中(with&屏幕水幕特效):城镇中(原始图)上(with&屏幕水幕特效):石桥上(原始图):&&&本次的更新大致如此,感谢各位,我们下周再见。&&附: 本博文相关下载链接清单&【百度云】博文示例场景exe下载【百度云】包含博文示例场景所有资源与源码的unitypackage下载【Github】Unity5 Standard Shader主文件源码逐行注释【Github】水幕屏幕特效实现源码&
版权声明:本文为博主原创文章,未经博主允许不得转载。
$T.total > 0 && $T.page <= $T.pageNum}
{#foreach $T.data as r}
{$T.r.formt_tm}{#if $T.r.nickname}{#else}匿名{#/if}
{$T.r.content}
{#if $T.page > 1 && $T.pageNum > 1)
$T.s_num > 2}
{#for index = $T.s_num to $T.e_num}
$T.pageNum > $T.pageNavSize+ 2 && $T.s_num != $T.pageNum - $T.pageNavSize}
{#if $T.pageNum > 1}
{#if $T.pageNum != $T.page && $T.pageNum > 1}
<a href="javascript:void(0);" page="{$T.page 下一页
您的回应...
也许你感兴趣
(window.slotbydup=window.slotbydup || []).push({
id: '3465635',
container: s,
size: '120,240',
display: 'float'
(C)2012 本站提供的内容来源于广大网络用户,我们不保证内容的正确性。如果转载了您的内容,希望删除的请联系我们!

我要回帖

更多关于 unity3d shader教程 的文章

 

随机推荐