Shader "Custom/_MyDiffuse" {
Properties{
_DiffuseColor("Color",Color)=(1,1,1,1)//漫反射强度
}
SubShader {
Tags { "LightMode=ForwardBase" }
CGPROGRAM
fixed4 _DiffuseColor;
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
}
struct v2f{
float4 pos:SV_POSITION;
fixed3 color:COLOR;
}
void vert(in a2v v,out v2f o )
{
o.pos=UnityObjectToClipPos(v.vertex );
//环境光
float3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
//世界坐标下的法线
float3 worldNormal=UnityObjectToWorldNormal(v.normal);
//世界坐标下的光线方向
fixed3 worldLight=normalize(_WorldSpaceLightPos0.xyz);
//计算漫发射 //漫反射=光线颜色*漫发射强度(max(0,法线方向*光线方向))
float3 diffuse=_LightColor0 *_DiffuseColor*saturate(dot(worldNormal ,worldLight));
o.color=ambient+diffuse;
}
fixed4 frag(v2f f):SV_TARGET{
return fixed4(o.color,1.0);
}
ENDCG
}
}
///UnityObjectToWorldNormal 底层实现方式 在UnityCG.cginc文件中
// inline float3 UnityObjectToWorldNormal( in float3 norm )
// {
// #ifdef UNITY_ASSUME_UNIFORM_SCALING//是否是统一缩放
// return UnityObjectToWorldDir(norm);//直接将法线转换到世界坐标
// #else
// // mul(IT_M, norm) => mul(norm, I_M) => {dot(norm, I_M.col0), dot(norm, I_M.col1), dot(norm, I_M.col2)}
// return normalize(mul(norm, (float3x3)unity_WorldToObject));
// #endif
// }
//UnityObjectToWorldDir 底层实现 在UnityCG.cginc文件中
// inline float3 UnityObjectToWorldDir( in float3 dir )
// {
// return normalize(mul((float3x3)unity_ObjectToWorld, dir));
// }
shader 入门精要代码以及部分方法的底层实现 1_漫反射
最新推荐文章于 2023-07-14 16:51:19 发布