原文链接:https://docs.unity3d.com/Manual/class-Shader.html
shader是包含给显卡提供要执行的代码和命令的资源。材质引用到shader,并且给其设置参数(纹理、颜色等等)。
Unity包含了一些内置的shader通常可以应用到您的项目中(比如Standard shader,链接见原网页)。您也可以写自己的shader并且应用于后处理效果。
创建一个新的shader
要创建一个shader,在主菜单或者是工程视图环境菜单中使用Assets > Create > Shader来创建。一个shader是一个类似于C#脚本的文本文件,由Cg/HLSL和ShaderLab语言来编写(请看编写shader页面来获取更多信息)。
(图片见原网页)
Shader监视面板
shader导入设置
这个监视面板部分允许对shader指定默认的纹理。当新的使用这个shader的材质被创建的时候,这些纹理会被自动的设置上去。
shader监视面板
Shader监视面板会显示这个shader的基础信息(大多数是shader的tags),并且允许编译和显示低等级编译的代码。
对于表面shader来说,显示生成代码按钮会显示所有Unity生成的要执行光影效果的代码。如果你真的想要去自定义生成的代码,你只需复制粘贴这些代码到您的shader原文件中然后开始调整。
(图片见原网页)
Shader编译弹出菜单
编译和显示代码按钮的弹出菜单可以显示对于选定的平台最后编译的shader代码(比如说Direct3D9程序集,或是对OpenGL ES优化的低等级的GLSL程序集)。这在优化shader的性能时非常有用,通常你会想知道这里最终生成了多少低等级的指令。
将生成的低等级代码粘贴入GPU shader性能分析工具会非常有用(比如AMD GPU ShaderAnalyzer或是PVRShaderEditor)。
Shader编译细节
在shader导入的时候,Unity并不编译完整的shader。这是因为大多数的shader内部有许多变体,把它们都编译,并且面向所有可能的平台,这将花费非常长的时间。所以我们转而采取这种方式:
·在导入时,只对shader做最小限度的处理(生成表面shader等等)。
·只在需要时才真正编译shader的变体。
·通常只编译最后的少数几个,而不是在导入时编译100-1000个内置的shader。
在程序构建的时候,所有还没被编译的shader变体都将被编译,这样即使编辑器没有使用它们,它们也会在游戏数据中。
然而,这也许意味着存在这个shader在导入时没有检测到的错误。比如说,你正在运行使用Direct3D 11的编辑器,但是一个shader也许会在编译成OpenGL平台时报错。或是这个shader的一些变体不适应于shader模型2.0指令限制等等。当编辑器使用它们时这些错误将会显示在监视面板中,完全手动的对您所需的平台对此shader进行完全的编译,也是一个检查错误的好方法。可以使用shader监视面板中的Compile and show code弹出菜单来执行它。
shader的编译是在一个名叫UnityShaderCompiler的后台进程中执行的,它会被Unity在需要编译shader的时候启动。可以启动多个编译进程(通常您的电脑CPU有几个核心就启动几个),这样在构建工程的时候shader编译就可以并行的完成。当编辑器不编译shader时,这个编译进程不会做任何事并且也不会消耗电脑的性能,所以请不要对他们有所顾忌。当Unity编辑器退出时它们也会被关闭。
独立的shader变体编译结果将会被缓存在工程中,在 Library/ShaderCache文件夹路径下。这意味着100%相同的shader或是它们的代码片段将会重用之前编译的结果。这也意味着shader缓存文件夹会变得相当大。如果你有很多shader会经常修改,删除它们总归是安全的,这只会造成shader变体被重新编译。
进一步的阅读
·材质资源(链接见原网页)
·写shader综述(链接见原网页)
·Shader参考(链接见原网页)
网友评论