Shader"Custom/Third"{
Properties{
_Color("MainColor",Color) = (1,1,1,1)
_MainTex("Albedo(RGB)",2D) ="White"{}
//光滑度
_Glossiness("Smoothness",Range(0,1)) =0.5
//金属光泽度
_Metallic("Metallic",Range(0,1)) =0.0
}
SubShader{
//表面着色器可以被若干个标签所修饰,通过判断标签来决定硬件什么时候该调用着色器、
//“RendererType”="Opaque"表示渲染不透明的物体
//RendererType赋值有:
//1.Opaque:绝大部分的不透明物体渲染时使用
//2.Transparent:绝大部分的透明物体渲染时使用
//3.BackGround:天空盒
//4.Overlay:用来渲染叠加效果,镜头光晕等
Tags{"RendererType"="Opaque"}
//LOD是LevelofDetail的缩写,我们能用什么样的shader由它来决定,如果我们在Unity的QualitySetting中设定最大LOD值小于subshader所指定的值时,则subshader不可使用
//Unity的Shader制定了一组LOD值,我们在写shader的时候作为参考,方便以后对设备图形性能调整,和画质有更精确的控制
//Vertexlitkindofshaders(顶点光照类型的shader)=100
//Diffuse(漫反射)=200
//ReflectiveBumpedUnlit(凸起反射不发光)=250
//ReflectiveBumpedVertexlit(顶点反射不发光)=250
//Bumped,Specular(凸起,高光)=300
//凹凸高光=400
//Parallax(视差)=500
//ParallaxSpecular(视差高光)=600
LOD200
//表面着色器的实现代码必须放在CGPROGRAM...ENDCG代码块中,而不是放在pass里边
//CG(NVIDIA公司开发的cforgraphic计算机图形编程C语言封装)
//CG程序可以根据运行时的需要或者事先编译成GPU汇编代码
CGPROGRAM
//这是一条编译指令,它声明了我们要写一个表面着色器,并且制定了光照模型,语法如下
//#pragrmsurfacesurfaceFunctionlightModel[optionparams]
//surface:声明一个表面着色器
//surfaceFunction:着色器方法的名字
//lightModel:使用光照的模型
//optionparams:可选参数,包括透明度,顶点与颜色,投影等等
#pragmasurfacesurfStandardfullforwardshadows
//使用shader3.0版本可以得到更好的光照效果
#pragmatarget3.0
//sampler2D是GPU中2D贴图的类型,还有sampler3D,samplerCUBE等
//所实例化的shader是由两个独立的块组成,属性声明和回调都是unity,可以直接使用和编译的shader
//在CG代码块中,想要访问在properties中所定义的变量的话,必须声明和属性变量名相同的名字进行使用
//sampler2DMainTex其实就是关联了属性_MainTex,之后CG程序就可以使用它了
sampler2D_MainTex;
//结构体,float2和vector2一样,里面存放了两个float类型的属性,可以使用变量名.x的方式获得某个值
//在CG程序中制定一个贴图变量前加uv字样,就代表提取它的uv值(其实就是两个代表贴图上的二维坐标点)所需要参与计算的数据
structInput {
//输入结构体重一般包含着色器所需要的纹理坐标,命名规范:uv+纹理名称
//当使用第二纹理,命名为:uv2+纹理名称
//输入结构体中还有其他成员变量
//float3viewDir:视角方向
//float4COLOR:每个顶点的颜色差值
//float4screenPos:屏幕坐标(使用.xy/.wh来获取屏幕2D坐标)
//float3worldRefl:世界坐标系中反射向量
//float3worldNormal:世界坐标系中法线向量
float2uv_MainTex;
};
half_Glossiness;
half_Metallic;
fixed4_Color;
//CG规定了表面着色器代码方法的参数类型和名字
//语法结构
//voidsurf(InputIN,inoutSurfaceOutputStandardo)
//其作用是结构输入的uv或者附加数据,然后进行处理,最后将结构填充到输出结构体中,所以只能按照规定来写
//参数1:Input:是我们需要定义的输入结构体,可以吧所需要参与计算的数据放到这个结构体中,传入方法使用
//参数2:inout:SurfaceOutput定义输出结构体的类型,需要把方法里面得到的结果赋值给该结构体里面的成员变量即可完成着色
//SurfaceOutput的输出结果结构定义如下:
//half3Albedo:像素的颜色
//half3Normal:法线
//half3Emission:自发光,不受光照影响
//halfSpecular:高光指数
//halfGloss:光泽度
//halfAlpha:透明度
//SurfaceOutPutStandard输出结果定义如下:
//fixed3Albedo:基础颜色
//fixed3Normal:切线空间法线
//halfSmoothness:是否光滑,0=粗糙,1=光滑
//halfMetallic:是否有金属光泽,0=非金属,1=金属
//halfOcclusion:遮挡(默认为1)
//fixedAlpha:透明度
voidsurf (Input IN,inoutSurfaceOutputStandard o) {
//Albedocomesfromatexturetintedbycolor
//tex2D方法是CG程序中用来在一张贴图中对一个点进行采样的方法
//返回一个fixed4类型
//这里是对_MainTex在输入点上进行采样
fixed4c =tex2D(_MainTex, IN.uv_MainTex) * _Color;
//把采样的颜色赋值给输出的颜色
o.Albedo = c.rgb;
//Metallicandsmoothnesscomefromslidervariable
//金属
o.Metallic = _Metallic;
//光滑
o.Smoothness = _Glossiness;
//透明度
o.Alpha = c.a;
}
ENDCG
}
FallBack"Diffuse"
}