1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
//使用单张纹理来代替物体的漫反射颜色 Shader "UnityShader/Single Texture" { properties{ _Color("Color Tint",Color)=(1,1,1,1)//控制物体的整体色调 _MainTex("Main Tex",2D)="While"{}//“white”是内置纹理的名字,一个全白的纹理 _Specular("Specular",Color)=(1,1,1,1) _Gloss("Gloss",Range(8.0,256))=20 } SubShader{ pass{ Tags{"LightMode"="ForwardBase"}//Pass标签,定义该Pass在Unity光照流水线中的角色 CGPROGRAM #pragma vertex vert #pragma fragment frag
#include "Lighting.cginc"//内置变量_LightColor0 fixed4 _Color; sampler2D _MainTex; float4 _MainTex_ST;//纹理名_ST,ST:缩放(scale)和平移(translation)._MainTex_ST.xy存储的是缩放值,_MainTex_ST.zw存储的是偏移值,分别对应材质面板的纹理属性Tiling和Offset fixed4 _Specular; float _Gloss;
struct a2v{ float4 vertex:POSITION; float3 normal:NORMAL; float4 texcoord:TEXCOORD;//将模型的第一组纹理坐标存储到该变量中 }; struct v2f{ float4 pos:SV_POSITION; float3 worldNormal:TEXCOORD0; float3 worldPos:TEXCOORD1; float2 uv:TEXCOORD2; };
v2f vert(a2v v){ v2f o; o.pos=UnityObjectToClipPos(v.vertex);// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' o.worldNormal=UnityObjectToWorldNormal(v.normal); o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
o.uv=v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;//对顶点纹理坐标进行缩放和平移 //或者调用内建的方法 //o.uv=TRANSFORM_TEX(v.texcoord,_MainTex)
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;//对纹理进行采样,返回纹素值*_Color得到反射率albedo
//环境光ambient=反射率albedo*环境光照 fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
//diffuse漫反射=平行光*反射率*Labert光照模型 fixed3 diffuse=_LightColor0.rgb*albedo*max(0,dot(worldNormal,worldLightDir));
//specular高光反射=平行光*高光反射颜色*Phong-Blinn模型 fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos)); fixed3 halfDir = normalize(viewDir+worldLightDir); fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);
return fixed4(ambient+diffuse+specular,1.0); }
ENDCG } } FallBack "Specular" }
|
近期评论