1.基本的纹理属性以及注释
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Ycb/Texture/Simple" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Specular("Specular",Color)=(1,1,1,1)
_Gloss ("Gloss",Range(8.0,256))=20
}
SubShader {
Pass{
Tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST; // S缩放T平移。得到材质面板的纹理属性的细节
float4 _Specular;
float _Gloss;
struct a2v{
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0; //模型的第一组纹理坐标存储到该变量, 而v2f中的用于存储纹理坐标的uv,便于在偏远着色i中使用该坐标进行纹理采样
};
struct v2f{
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos :TEXCOORD1;
float2 uv: TEXCOORD2;
};
v2f vert(a2v v){
v2f o;
o.pos =mul(UNITY_MATRIX_MVP,v.vertex);
o.worldNormal=UnityObjectToWorldNormal(v.normal);
o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;
// o.uv=v.texcoord.xy *_MainTex_ST.xy+_MainTex_ST.zw; //缩放,平移
o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//第一个参数:顶点纹理坐标,第二个参数纹理名,实际用 纹理名_ST
// 内置如下:
//#define TRANSFORM_TEX(tex,name) (tex.xy* name##_ST.xy + name##_ST.zw)
return o;
}
fixed4 frag(v2f i):SV_Target{
fixed3 worldNormal =normalize(i.worldNormal);
fixed3 worldLightDir =normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed3 albedo=tex2D(_MainTex,i.uv).rgb*_Color.rgb; //第一个参数被采样的纹理,第二个参数 float2类型的纹理坐标。返回纹素值
//采样结果和颜色属性成绩作为材质的反射率 albedo
//结果与环境光照乘机,得到环境光部分。
fixed3 ambient =UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
//虽有使用albedo来计算漫发射光找结果,个人感觉,只要是混合颜色全是乘法,若是类似于结果的样颜色叠加则是+法
fixed3 diffuse =_LightColor0.rgb*albedo*max(0,dot(worldNormal,worldLightDir));
fixed3 viewDir=normalize(UnityWorldSpaceViewDir(i.worldPos));
fixed3 halfDir=normalize(worldLightDir+viewDir);
fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);
return fixed4(ambient +diffuse +specular,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}