漫反射-逐像素光照(半兰伯特)
来源:互联网 发布:网络电视机顶盒直播软件哪个好 编辑:程序博客网 时间:2024/06/06 12:29
Shader "Custom/testShader" {
properties
{
_Diffuse("my Diffuse",Color)=(1.0, 1.0, 0.0, 1.0)
}
subshader
{
Tags{"LightMode"="ForwardBase"}
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse;
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
};
v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.worldNormal = mul(v.normal, (float3x3)_World2Object);
return o;
}
fixed4 frag(v2f i):SV_Target //计算漫反射光照模型
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //得到环境光
fixed3 worldNormal = normalize(i.worldNormal); //得到世界空间中的法线
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); //得到世界空间中的光照
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb *saturate(dot(worldNormal, worldLightDir));
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);
}
ENDCG
}
}
Fallback "Diffuse"
properties
{
_Diffuse("my Diffuse",Color)=(1.0, 1.0, 0.0, 1.0)
}
subshader
{
Tags{"LightMode"="ForwardBase"}
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse;
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
};
v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.worldNormal = mul(v.normal, (float3x3)_World2Object);
return o;
}
fixed4 frag(v2f i):SV_Target //计算漫反射光照模型
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //得到环境光
fixed3 worldNormal = normalize(i.worldNormal); //得到世界空间中的法线
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz); //得到世界空间中的光照
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb *saturate(dot(worldNormal, worldLightDir));
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);
}
ENDCG
}
}
Fallback "Diffuse"
}
【说明】
1. 顶点着色器不需要计算光照模型,只需要把世界空间下的法线传递给片元着色器即可。
2. 在光线无法达到的区域,模型的外观是黑色的,解决背光面明暗问题,提出了半兰伯特模型
在逐像素光照上只需改变如下:
fixed4 frag(v2f i) : SV_Target {
// Get ambient term
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed halfLambert = dot(worldNormal, worldLightDir) * 0.5 + 0.5;
fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert;
fixed3 color = ambient + diffuse;
return fixed4(color, 1.0);
}
3. 半兰伯特模型原理:
Half Lambert技术实现的是原理是把漫反射光照值的范围分成两半,然后加上0.5。基本意思就是如果光照值是1,对半开后就是0.5,然后再加0.5回去,将会再得到1。如果你对0进行操作,那么你会得到0.5,因此我们将0~1之间的值重新映射到区间0.5~1。
下图展示了漫反射的值经过Half Lambert计算后的函数曲线图。
0 0
- 漫反射-逐像素光照(半兰伯特)
- unity shader漫反射中逐像素的光照模型
- 漫反射-逐顶点光照
- opengl光照之漫反射逐顶点渲染与逐像素渲染
- Shader自学笔记 2.1.2 逐像素漫反射光照模型实现
- UnityShader初级篇——实现逐像素漫反射光照模型
- 漫反射光照
- 【UnityShader入门精要】Unityshader中的漫反射(逐像素漫反射diffuse)
- 逐像素的光照
- Unity3D逐像素漫反射着色器代码
- 简单像素漫反射(书里的)
- 第六章:漫反射光照
- 漫反射光照模型
- 光照漫反射(平行光)
- 为何使用逐像素光照
- GLSL 逐像素的光照
- unity Shader 的漫反射逐顶点的光照模型
- Shader山下(二)光照模型——漫反射
- 14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率:
- JWS 批注参考WebService注解
- Android MTK camera preview画面倒转解决
- 常见配准算法NDT和ICP
- java面向对象高级分层实例_数据库操作类
- 漫反射-逐像素光照(半兰伯特)
- 基于K-gram的winnowing特征提取剽窃查重检测技术(概念篇)
- federated存储引擎 (mysql)
- javascript中局部变量与全局变量
- 疯狂H5笔记 - DOM编程详解
- 【NOIP模拟题】【数学归纳法】2016.11.10第一题题解
- 线程池解析
- c_str()函数的用法
- PV、UV、IP的区别