创建Shader脚本
Project视图中右击 ---> Create ---> Shader ---> 选择一种模板
打开此脚本,首行代码显示此Shader路径
Shader "Custom/TestShader"
使用Shader
创建材质球, 选择此材质球,在Inspector视图中将Shader选项按照上面代码中路径,选择为对应Shader。
将此材质球添加到物体,则物体使用相应的Shader。
固定渲染管线
属性
属性是让着色器使用者进行纹理指定和对着色器的值调整的接口。
属性可以作为GUI元素暴露在材质的Inspector面板上,而不需要单独的编辑器,它提供了可视化的方法进行对着色器的调整。
Properties
用来声明属性变量
声明变量格式:
变量名("变量在外部面板中的名字",变量类型) = 默认值/缺省值
示例:
Shader "Custom/TestShader"
{
Properties
{
_TestInt("测试值",int) = 0
}
}
选择绑定了此脚本的材质球或对应物体,可以看到:
更多数据类型
Shader "Custom/TestShader"
{
Properties{
_TestInt("Int",int) = 0//数值
_TestFloat("Float",float) = 0//数值
_TestRange("Range",Range(0,10)) = 5//区间值
_TestColor("Color", Color) = (1,1,1,1)//颜色
_TestTexture("Texture", 2D) = "" {}//图片/纹理
_TestVectorA("VectorA",vector) = (0,0,0,1)//点
_TestVectorB("VectorB",vector) = (0,0,0,0)//向量
_TestCube("Cube", Cube) = "" {}//Cubemap
}
}
注意:语句结尾不加分号,浮点数后不加后缀。
表面着色器的属性类型 | |
Range(min,max) | 创建Float属性,以滑动条的形式便于在最大值和最小值之间进行调节 |
Color | 创建色块,可以在Inspector面板上通过拾色器获取颜色值=(float,float,float,float) |
2D | 创建纹理属性,允许直接拖拽一个纹理 |
Rect | 创建一个非2次方的纹理属性,作为2D GUI元素 |
Cube | 在Inspector面板上创建一个立方贴图属性,允许用户直接拖拽立方贴图作为着色器属性 |
Float | 在Inspector面板上创建一个非滑动条的float属性 |
Vector | 创建一个拥有4个float值的属性,可以用于标记方向或颜色 |
SubShader(子着色器)
SubShader可以有多个。Unity会自动找到当前设备硬件支持的SubShader执行。
pass(渲染通道)
pass可以有多个。效果变化
每个pass就是一个DrawCall,尽量只使用一个pass。
Shader "Custom/TestShader"
{
Properties
{
_color("主颜色", color) = (1,0,0,1)
}
SubShader
{
pass
{
color[_color]
}
}
}
material
Shader "Custom/TestShader"
{
Properties
{
_color("主颜色",color) = (1,1,1,1)
_ambient("环境光",color) = (1,1,1,1)
_specular("亮光",color) = (1,1,1,1)
_shininess("亮光范围",range(0,10)) = 2
_emission("自发光",color) = (0.5,0.5,0.5,1)
_mainTex1("贴图1",2D) = ""{}
_mainTex2("贴图2",2D) = ""{}
}
SubShader
{
Tags{"Queue" = "Transparent"}//如果当前物体为透明物体,它将在不透明物体后渲染
pass
{
Blend SrcAlpha OneMinusSrcAlpha//支持透明度
material
{
Diffuse[_color]//漫反射
Ambient[_ambient]//环境光
Specular[_specular]//亮光
Shininess[_shininess]//亮光范围
Emission[_emission]//自发光
}
Lighting on//开启灯光
SeparateSpecular on//开启亮光
//设置纹理贴图(只允许一个参数,需要多个贴图时,需要写多个Settexture)
Settexture[_mainTex1]
{
//融合(primary使当前贴图与上面已经实现的material效果实现融合,double使亮度加强两倍,加强四倍使用quad)
Combine texture * primary double
}
Settexture[_mainTex2]
{
//融合(previous使当前贴图与上面已经实现的material效果及贴图效果实现融合)
Combine texture * previous double
}
}
}
//FallBack"Diffuse"
}
FallBack "Diffuse"
如果SubShader无法实现,则自动使用Diffuse这个Shader进行显示。
固定渲染管线无法做到模型身体的一部分接收漫反射而另一部分不接收。