Unity Shaders and Effects Cookbook (1-5)使用2D渐变纹理模拟BRDF(双向反射分布函数)
2016-03-21 02:33
411 查看
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
转自 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
相关文章推荐
- java程序员图文并茂细说Unity中调用Android的接口 (转)
- unity导入模型无色
- unityassetbundle 打包存放百度云加载
- [UnityShader2]顶点片段着色器实例(六)
- Unity3D学习笔记(5)—— 牧师和魔鬼游戏改进
- Unity脚本事件执行的顺序
- Unity3D开发基础组件提取总结
- [UnityShader2]顶点片段着色器实例(五)
- Unity AssetBundle爬坑手记
- Unity Shaders and Effects Cookbook (1-4) 创建 Ramp Texture(渐变纹理)控制漫反射着色
- [UnityShader2]顶点片段着色器基础
- 关于Unity3D协程的使用
- 破解Unity3D的步骤-为部分人提供帮助
- 配置Unity脚本开发环境visual studio 2013 tools for unity
- unity c# LINQ查询
- unity c# Lambda表达式
- unity c# 泛型委托
- unity c# 标准事件模式
- unity c# 事件
- unity c# 接口