渐变纹理(光照渐变)

渐变纹理(光照渐变)

在计算公式兰伯特光照模型 diffuse = I * albedo * saturate(normal * lightDir)当中 I=光照强度是固定的 albedo=主纹理也是固定的。只有后面计算是不固定的 所以先计算后面部分saturate(normal * lightDir) 对渐变纹理进行采样 然后和主纹理 表面颜色进行正片叠底混合

Shader "QStudyShader/RampTexture"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		_RumpTex("RumpTexture", 2D) = "ramp"{}
		_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)
		_Gloss("Gloss",Range(8,100)) = 20.0
	}
		SubShader{
			Pass{
				Tags{"LightModel" = "ForwardBase"}
				CGPROGRAM
				#include "Lighting.cginc"
				#pragma vertex Vertex
				#pragma fragment Fragment
				struct a2v {
					float4 vertex : POSITION;
					float3 normal : NORMAL;
					float4 texcoord : TEXCOORD0;
				};
				struct v2f {
					float4 pos : SV_POSITION;
					float2 uv : TEXCOORD0;
					float3 worldNormal : TEXCOORD1;
					float3 worldPos : TEXCOORD2;
				};
				sampler2D _MainTex;
				sampler2D _RampTex;
				fixed4 _BaseColor;
				float _Gloss;
				v2f Vertex(a2v v){
					v2f o;
					o.pos = UnityObjectToClipPos(v.vertex);
					o.uv = v.texcoord;
					o.worldNormal = UnityObjectToWorldNormal(v.normal);
					o.worldPos = mul(unity_ObjectToWorld,v.vertex);
					return o;
				}
				fixed4 Fragment(v2f i) : SV_TARGET{
					//采用半兰伯特光照模型需要光源向量
					//高光计算需要视角向量
					fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
					fixed3 worldNormal = normalize(i.worldNormal);
					fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
					//使用半兰伯特光照模型 对传进来的每一个法线方向和光照方向来一次点积 再给与0.5倍的缩放和0.5的偏移 
					fixed halfLambert = 0.5 * dot(worldNormal, lightDir) + 0.5;
					//然后用(halfLambert,halfLambert)来构建一个纹理坐标 并且对_RampText(渐变纹理)进行采样 输出到构建的纹理坐标当中 
					//最后和表面基础颜色_BaseColor和主纹理进行混合 
					//因为在计算公式兰伯特光照模型 diffuse = I * albedo * saturate(normal * lightDir)当中 I=光照强度是固定的 albedo=主纹理也是固定的
					//只有后面计算是不固定的 所以先计算后面部分saturate(normal * lightDir) 对渐变纹理进行采样 然后和主纹理 表面颜色进行正片叠底混合
					fixed3 albedo = tex2D(_RampTex, fixed2(halfLambert, halfLambert)).xyz * _BaseColor.xyz * tex2D(_MainTex, i.uv).xyz;
					//渐变纹理就是和环境光 漫反射
					fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
					//漫反射
					fixed3 diffuse = _LightColor0.xyz * saturate(dot(worldNormal,lightDir)) * albedo;
					//半程向量 用于计算高光部分
					fixed3 halfDir = normalize(viewDir + lightDir);
					//高光部分
					fixed3 specular = _LightColor0.xyz * pow(saturate(dot(worldNormal,halfDir)),_Gloss);

					return fixed4(diffuse + ambient + specular,1.0);
				}
				ENDCG
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值