Unity Shaders使用CgInclude让你的Shader模块化——使用#define指令创建Shader
Posted cxchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shaders使用CgInclude让你的Shader模块化——使用#define指令创建Shader相关的知识,希望对你有一定的参考价值。
本系列主要參考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同一时候会加上一点个人理解或拓展。
这里是本书全部的插图。
========================================== 切割线 ==========================================
写在前面
我们已经看到怎样使用Unity内置的CgInclude文件。以及怎样创建我们自己的CgInclude去保存光照模型、变量和辅助函数。在这篇中,我们关注怎样更动态、有效地使用CgInclude文件,使得我们的Shader更加模块化,而且能够依据须要切换不同的状态。
因此,本篇中,我们将会改动上一节中创建的Half Lambert光照模型,为它加入一个定义(definition)。
这样,假设我们的Shader中定义了Half Lambert,那光照模型将会使用Half Lambert漫反射。否则就会使用标准的NdotL光照模型。
这节代码就3行,仅仅是个引子。
实现
我们首先再来看一下我们的CgInclude文件。
我们想要让该光照模型具有两个状态:
- 第一个状态。是正常的NdotL(Normal*LightDir)漫反射光照模型。而第二个状态,就是一个Half Lambert光照模型。改动我们的CgInclude文件去包括以下的两行代码:
- 然后,在我们的Shader中,更新CGPROGRAM块中的指令:
- 保存你的Shader,返回Unity编译。这时你不会看到不论什么变化。这是由于我们告诉Unity,去定义一个名为HalfLambert的指令,假设它在不论什么已包括的文件里找到了这个定义。它就会使用第一步中的代码。
- 返回Shader。然后凝视掉我们刚才新加的指令。
保存后返回Unity查看:
这时由于我们未定义HalfLambert,因此Unity在编译时将会跳过那段代码。这使得我们的Shader更加灵活有效,我们能够不再编写或删除大量反复的代码。
解释
这使得我们更easy地去调用光照模型,或者使用多个状态去改动它。
以上是关于Unity Shaders使用CgInclude让你的Shader模块化——使用#define指令创建Shader的主要内容,如果未能解决你的问题,请参考以下文章
Unity Shaders初探Surface Shader背后的机制
Unity Shaders——屏幕灰度效果(Screen Effect)