shader 入门精要代码以及部分方法的底层实现 1_漫反射

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));
// }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值