文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html
作者:毛星云(浅墨) 微博:http://weibo.com/u/1723155442
QQ交流群:330595914
更多文章尽在:http://www.hpw123.net
本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而讲解完表面Shader,后续文章最终会讲解到顶点着色器和片段着色器(也就是可编程Shader)。
文章第一部分复习和进一步了解了Unity中Shader的三种形态,然后讲解了固定功能Shader中混合操作的方方面面,然后以6个Shader的书写作为实战内容,最后创建了一个温馨美好的圣诞夜场景进行了Shader的测试。
依旧是国际惯例,先上本文配套程序的截图吧。
圣诞节就快到了,而下次更新就已经过了圣诞节,于是这次更新浅墨就提前把这个场景放出来吧,预祝大家圣诞节快乐~
雪花飘落:
可爱的圣诞雪人:
精心装扮的圣诞树:
月是故乡明:
雾气弥漫:
OK,图先就上这么多。文章末尾有更多的运行截图,并提供了源工程的下载。可运行的exe下载在这里:
【可运行的exe游戏场景请点击这里下载试玩】
好的,我们正式开始。
可编程Shader的特点为:
功能最强大、最自由的形态。
编译指令 |
示例/含义 |
#pragma vertex name |
替换name,来指定Vertex Shader函数、Fragment Shader函数。 |
#pragma target name |
替换name(为2.0、3.0等)。设置编译目标shader model的版本。 |
#pragma only_renderers name name ... |
#pragma only_renderers gles gles3, |
关于引用库。通过形如#include "UnityCG.cginc"引入指定的库。常用的就是UnityCG.cginc了。其他库详见官网Built-in shader include files。
数据结构 |
含义 |
appdata_base |
顶点着色器输入位置、法线以及一个纹理坐标。 |
appdata_tan |
顶点着色器输入位置、法线、切线以及一个纹理坐标。 |
appdata_full |
顶点着色器输入位置、法线、切线、顶点颜色以及两个纹理坐标。 |
appdata_img |
顶点着色器输入位置以及一个纹理坐标。 |
而如下便是常用混合操作符(blend operations)的含义列举:
Add |
将源像素和目标像素相加. |
Sub |
用源像素减去目标像素 |
RevSub |
用目标像素减去源像素 |
Min |
取目标像素和源像素颜色的较小者作为结果 |
Max |
取目标像素和源像素颜色的较大者作为结果 |
One | 值为1,使用此因子来让帧缓冲区源颜色或是目标颜色完全的通过。 |
Zero | 值为0,使用此因子来删除帧缓冲区源颜色或目标颜色的值。 |
SrcColor | 使用此因子为将当前值乘以帧缓冲区源颜色的值 |
SrcAlpha | 使用此因子为将当前值乘以帧缓冲区源颜色Alpha的值。 |
DstColor | 使用此因子为将当前值乘以帧缓冲区源颜色的值。 |
DstAlpha | 使用此因子为将当前值乘以帧缓冲区源颜色Alpha分量的值。 |
OneMinusSrcColor | 使用此因子为将当前值乘以(1 -帧缓冲区源颜色值) |
OneMinusSrcAlpha | 使用此因子为将当前值乘以(1 -帧缓冲区源颜色Alpha分量的值) |
OneMinusDstColor | 使用此因子为将当前值乘以(1 –目标颜色值) |
OneMinusDstAlpha | 使用此因子为将当前值乘以(1 –目标Alpha分量的值) |
【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑
原文地址:http://blog.csdn.net/u010283694/article/details/42085871