Unity Shaders and Effects Cookbook (1-5)使用2D渐变纹理模拟BRDF(双向反射分布函数)

BRDF,双向反射分布函数,简单理解为 入射光在不透明物体上,同事反射到观察者方向 和 出射光方向。

转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn

首先用PS创建一个渐变图片,先用 前景色到背景色渐变 ,然后前景色到透明渐变。


上面也说了,BRDF 是入射光 同时反射到 出射光 和 观察者眼睛方向的,所以这里我们要选择 需要视角方向的前向着色


仍然以基本的漫反射光照模型为例,主要修改下面代码。

1、使用 需要视角方向的前向着色

//需要视角方向的前向着色
inline float4 LightingBasicDiffuseWithViewDir(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)
{
	float difLight=dot(s.Normal , lightDir); //根据法线与光照方向的夹角计算cos值
	float rimLight=dot(s.Normal , viewDir);
	float hLambert=difLight * 0.5 + 0.5;
	float3 ramp = tex2D(_RampTex,float2(hLambert,rimLight)).rgb;

	float4 col;
	col.rgb=s.Albedo * _LightColor0.rgb * (ramp);
	col.a=s.Alpha;
	return col;
}

2、指定光照模型

#pragma surface surf BasicDiffuseWithViewDir

完整Shader代码

Shader "CookBookShaders/BRDF" {
	Properties {
		_EmissiveColor("Emissive Color",Color) = (1,1,1,1) //设置默认值
		_AmbientColor("Ambient Color",Color) = (1,1,1,1)
		_PowValue("Power Value",Range(0,10)) = 2.5
		_RampTex("Ramp Texture",2D) = "" //添加_RampTex属性接受一个Texture
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf BasicDiffuseWithViewDir

		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _PowValue;
		sampler2D _RampTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) 
		{
			float4 c;
			c=pow((_EmissiveColor+_AmbientColor),_PowValue);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}

		//需要视角方向的前向着色
		inline float4 LightingBasicDiffuseWithViewDir(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)
		{
			float difLight=dot(s.Normal , lightDir); //根据法线与光照方向的夹角计算cos值
			float rimLight=dot(s.Normal , viewDir);
			float hLambert=difLight * 0.5 + 0.5;
			float3 ramp = tex2D(_RampTex,float2(hLambert,rimLight)).rgb;

			float4 col;
			col.rgb=s.Albedo * _LightColor0.rgb * (ramp);
			col.a=s.Alpha;
			return col;
		}

		ENDCG
	} 
	//FallBack "Diffuse"
}
转自 http://blog.csdn.net/huutu http://www.thisisgame.com.cn

运行效果,右边的球就是BRDF效果,可以下载例子项目观看:


主要的是 我们使用了需要视角方向的前向着色,然后根据 法线 和 视角方向角度计算 COS 值 得到 rimLight ,以 hLambert 和 rimLight 作为UV值去采样,从而得到图中效果。


示例工程下载:

http://pan.baidu.com/s/1dDNTotj


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值