shader 渐变纹理

纹理一开始的作用是用以定义物体的颜色,但后面发现纹理可以存储任何表面属性。比如说,使用渐变纹理来控制漫反射光照的结构。在很多卡通风格的渲染中都使用了该技术。

_RampTex实际上是一个一维纹理,因此纹理坐标的u和v方向我们都使用了halfLambert

Shader "MyShader/rampTexture"
{
	Properties
	{
		_RampTex("RampTex",2D)="white"{}
		_Diffuse("diffuse",Color) = (1,1,1,1)
		_Specular("specular",Color) = (1,1,1,1)
		_Gloss("gloss",Range(1,256)) = 5
	}
	SubShader
	{
		Tags { "RenderType" = "Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag


			#include "UnityCG.cginc"
			#include "UnityLightingCommon.cginc"

			sampler2D _RampTex;
			fixed4 _Diffuse;
			float4 _Specular;
			float _Gloss;

			struct v2f
			{
				float4 vertex:SV_POSITION;
				float3 worldNormal:TEXCOORD0;
			};

			v2f vert(appdata_base v)
			{
				v2f o;
				//o.uv = v.texcoord.xy*_RampTex_ST.xy + _RampTex_ST.zw;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				//环境光
				float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;

				//漫反射
				float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
				float halfLambert = saturate(dot(worldLight, i.worldNormal)*0.5 + 0.5);
				float3 diffuse = _Diffuse.rgb*tex2D(_RampTex,float2(halfLambert, halfLambert)).rgb*_LightColor0.rgb;

				//blinn Phong高光反射
				//float3 reflectDir = normalize(reflect(-worldLight, i.worldNormal));
				float3 viewDir = normalize(_WorldSpaceCameraPos - UnityObjectToWorldDir(i.vertex));//mul(unity_ObjectToWorld, i.vertex)
				float3 halfDir = normalize(_WorldSpaceLightPos0.xyz + viewDir);
				float3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(halfDir, i.worldNormal)), _Gloss);

				float3 temp = diffuse + ambient + specular;
				return fixed4(temp, 1);
			}
			ENDCG
		}
	}
}

发布了15 篇原创文章 · 获赞 0 · 访问量 242

猜你喜欢

转载自blog.csdn.net/weixin_43839583/article/details/104057443