我对shader编程的看法是:面对GPU的编程。一般来说,从内存中取得的FBX模型会在GPU中进行渲染,一次来平衡CPU和GPU的性能消耗。GPU的渲染管线为:顶点着色器->光栅化->片段着色器->alpha测试->模板测试->深度测试->Blend->Gbuffer->frontBuffer->frameBuffer->显示器。
在Shader1.0中,主要针对顶点着色器(计算顶点颜色,灯光作用)和片段着色器(处理材质)
顶点着色器的使用
//Shader编程是没有;的
//shader的名字和路径
Shader "Hidden/NewImageEffectShader"
{
//属性,可以展示给外界修改,显示
Properties
{
_MainTex ("Texture", 2D) = "white" {}
//定义颜色的变量,默认为红色
_TestColor("TestColor",Color)=(1,0,0,1)
}
//在显卡中运行适合自己的SubShader(可以有多个),对应显卡
SubShader
{
//每个pass都会渲染一次物体,对应渲染通道
Pass
{
//改变顶点的颜色的两种方式
//通过改变顶点的数值 Color(0,1,0,1)
//通过变量来调节
Color[_TestColor]
//定义了材质和灯光如何作用,只有这样,灯光的颜色才会影响材质的颜色
Material
{
//定义了材质的漫反射和灯光作用的方式
//Diffuse(1,1,1,1)
//漫反射
Diffuse[_TestColor]
//环境光
Ambient[_TestColor]
//镜面反射
Specular[_TestColor]
//自发光
Emission[_TestColor]
}
//打开灯光
Lighting On
//打开高光
SeparateSpecular On
}
}
}
片段着色器
Pass
{
//顶点计算的颜色
//Color[_TestColor]
//SetTexture[_MainTex]
//{
// //显示当前的纹理变量
// combine Texture //*Primary
// //显示顶点计算出来的颜色
// //Combine primary
//}
SetTexture[_FirstTex]
{
combine Texture
}
SetTexture[_MainTex]
{
combine Texture*Previous
}
SetTexture[_SecondTex]
{
combine Texture*Previous
}
SetTexture[_MainTex]
{
//设置Constant的第二种方式--变量
constantColor[_TestColor]
//纹理的混合,该Texture和Previous进行插值运算,combine为关键字
combine Previous lerp(Texture) Texture
}
/*SetTexture[_SecondTex]
{
//设置Constant的第一种方式
constantColor(1,0,0,1)
combine Texture+Constant
}*/