Unity shader入门精要学习笔记-代码篇1(漫反射光照模型/高光反射光照模型/内置函数实现)

一.逐顶点漫反射光照模型

首先计算公式: 兰伯特模型  Cdiffuse=(Clight•mdiffuse)max(0,n•I)   n表面法线,I指向光源的单位矢量,mdiffuse材质漫反射颜色,Clight光源颜色

unity操作步骤(通用就写一遍吧):

1.Unity新建场景,窗口-渲染-照明设置-天空盒子选择none

2.新建材质

3.新建unity shader ,赋给第二步的材质

4.创建胶囊体,将第二步材质赋给物体

5.保存场景

那么接下来就是代码啦!


// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'




Shader "Custom/DiffuseVertexLevel"
{
	Properties {
		_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
	}
	SubShader {
		Pass { 
			Tags { "LightMode"="ForwardBase" }
		
			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;
				fixed3 color : COLOR;
			};
			
			v2f vert(a2v v) {
				v2f o;
				// Transform the vertex from object space to projection space
				o.pos = UnityObjectToClipPos(v.vertex);
				
				// Get ambient term
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//得到环境光
				
				// Transform the normal from object space to world space
				fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//_World2Object从世界空间到模型
				// Get the light direction in world space
				fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);//场景中只有一个平行光,_WorldSpaceLightPos0得到光源方向
				// Compute diffuse term
				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));//_LightColor0访问该Pass处理的光源的颜色
				
				o.color = ambient + diffuse;
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				return fixed4(i.color, 1.0);
			}
			
			ENDCG
		}
	}
	FallBack "Diffuse"
}

 


二.逐像素漫反射光照模型

首先计算公式一样,只是把计算放到片元着色器中。

得到更平滑的光照效果,但是背光区域像平面失去细节。

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值