标签:des style blog http color 使用 io strong 文件
本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。
这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。
========================================== 分割线 ==========================================
啦啦啦,又开了新的一章。。。为什么会讲CgInclude呢?什么又是Cg呢?呜,按我的理解就是Cg是Shader语言里面的跨平台语言。众所周知,GLSL语言是工作在OpenGL接口上的,而HLSL语言是工作在DirectX接口上的,而Cg语言可以使用这两种不同的API,而不需要考虑平台问题。当然,这里面还有很多平台相关的性能问题。Unity允许在Shader中嵌套Cg代码片段,然后会再编译成OpenGL、DirectX、Flash等,以便让我们的Shader工作在不同的平台上。而使用CgInclude可以让我们重用代码,实现Shader的模块化。
实际上,我们之前在不知不觉中就使用过一系列Unity内置的CgInclude来编写Surface Shader。还记得Lambert、BlingPhony光照函数吗?这就是使用了Unity提前为我们编写好的Cg片段。理解并编写我们自己的CgInclude文件,有助于我们更快、更方便地修改Shader。而在编写自己的文件之前,我们先来学习下Unity为我们提供了哪些内置的光照模型、函数和状态变量。
Surface Shader是Unity的骄傲,它为我们节省了很多代码量,其中很重要的原因就是它在背后为我们做了很多工作。我们可以在Editor/Data/CGIncludes(MAC下是Content/CGIncludes)下找到这些代码。这些文件有的负责阴影和光照,有的则是一些辅助函数,还有一些负责平台依赖。如果没有它们,我们的Shader编写起来会变得更加费劲。
你可以在这个链接里找到Unity提供的一些信息。
下面通过使用UnityCG.cginc文件里面的辅助函数,来正式开始理解内置的CgInclude文件。
Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _DesatValue ("Desaturate", Range(0, 1)) = 0.5 }
sampler2D _MainTex; fixed _DesatValue;
void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = lerp(c.rgb, Luminance(c.rgb), _DesatValue); o.Alpha = c.a; }
// Converts color to luminance (grayscale) inline fixed Luminance( fixed3 c ) { return dot( c, fixed3(0.22, 0.707, 0.071) ); }
【Unity Shaders】使用CgInclude让你的Shader模块化——Unity内置的CgInclude文件
标签:des style blog http color 使用 io strong 文件
原文地址:http://blog.csdn.net/candycat1992/article/details/38780387