Unity Shader入门笔记:漫反射的逐顶点光照和逐片元光照

发表于2018-04-28
评论0 2.7k浏览
本篇文章主要和大家介绍漫反射的逐顶点光照和逐片元光照。其中逐顶点光照,简单地说就是在vetext shader中计算光照颜色,该过程将为每个顶点计算一次光照颜色,然后在通过顶点在多边形所覆盖的区域对像素颜色进行线形插值。逐像素光照是对所有光照元素进行单独插值,简单地说就是在pixelshader中计算颜色。下面就分别看看他们的shader实现代码吧。

直接上代码:
Shader "Custom/zhudingdian" {
Properties {
_Diffuse("Diffuse",color) = (1,1,1,1)
//用于颜色设置
}
SubShader {
pass{
tags{"LightMode" = "ForwardBase"}
CGPROGRAM
float4 _Diffuse;
//取用设置中的颜色信息
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
struct a2v {
float4 vertex:POSITION;
float3 normal :NORMAL;
};
struct v2f{
float4 pos :SV_POSITION;
float3 color :color;
};
v2f vert(a2v i){
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,i.vertex);
//将顶点坐标变换到世界坐标系
float3 worldNormal = normalize(mul(i.normal,(float3x3)unity_WorldToObject));
//把顶点法线变换到世界坐标系
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
//取得环境光的颜色信息
float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
//获得世界中光的入射信息
float3 diffuse = _LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLight));
//进行计算。公式为 :入射光信息*自身反射信息*(法线和入射光的点积)
o.color = ambient + diffuse;
//加入环境光
return o;
}
fixed4 frag(v2f i):SV_Target{
return float4(i.color,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
以上为逐顶点计算,为非线性,过度较为不均匀

增加:逐像素计算也贴上
Shader "Custom/zhuxiangsu" {
Properties {
_Diffuse("Diffuse",color) = (1,1,1,1)
}
SubShader {
pass{
tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
float4 _Diffuse;
struct a2v{
float4 vertex :POSITION;
float3 normal :NORMAL;
};
struct v2f{
float4 pos:SV_POSITION;
fixed3 worldNormal:TEXCOORD0;
};
v2f vert(a2v i){
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,i.vertex);
o.worldNormal = mul(i.normal,(float3x3)unity_WorldToObject);
return o;
}
fixed4 frag(v2f i):SV_Target{
float3 worldNormal = normalize(i.worldNormal);
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLight));
fixed3 color = diffuse + ambient;
return fixed4(color,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
逐像素过度较为均匀,但是消耗增加

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引