Unity Shader unity文档学习笔记(三):漫反射模型

漫反射模型:就是例如桌子底下没有光照但又不是完全黑的
这是因为有其他光源反射到桌子底下了
而想要做成实现中的光源 这个是有点难度的
所以就有简单的思路,做一个粗糙的光照模型

简单的思路:运用在平行光环境下
怎么判断一个点的受光强度?
通过一个点的法线和平行光的法线

夹角为0时说明光照强度最大
90度内越大光照强度越小
大于90度可以当作不受光
这是两个向量
点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大
下面附上代码
还有我学习的视频网址https://www.taikr.com/my/course/455

SubShader
	{

		Pass
		{
			Tags { "LightMode"="ForwardBase" }
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			
			#include "Lighting.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};

			struct v2f
			{
				fixed3 color :Color;
				float4 vertex : SV_POSITION;
			};

		
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				float3 lDir = normalize(_WorldSpaceLightPos0.xyz); //平行光
				float3 nDir = normalize(mul(v.normal,(float3x3)unity_WorldToObject));//一个点的法线
				fixed3 diffuse = _LightColor0.rgb*saturate(dot(nDir,lDir));//点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大
				o.color = diffuse;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				return fixed4(i.color,1.0);
			}
			ENDCG
		}
	}

效果
可以看出来有明显的三角形
可以看出来有明显的三角形
在这里插入图片描述

片元着色器进行着色

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

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Unlit/VertDiffuseTest"
{
	SubShader
	{
		
		Pass
		{
			Tags { "LightMode"="ForwardBase" }
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			// make fog work
			
			#include "Lighting.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};

			struct v2f
			{
				fixed3 normal : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.normal = mul(v.normal, (float3x3)unity_WorldToObject);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
                float3 lDir = normalize(_WorldSpaceLightPos0.xyz); //平行光
				float3 nDir = normalize(i.normal);//一个点的法线
				fixed3 diffuse = _LightColor0.xyz * saturate(dot(lDir, nDir));//点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大
				return fixed4(diffuse, 1.0);
			}
			ENDCG
		}
	}
}

效果
在这里插入图片描述

最后顺便说一下
顶点着色器是会对附上材质网格的每个顶点进行顶点上的改变
片段着色器是会对每个网格上三角形进行颜色上的改变

如果是考虑效率 一个模型的顶点较少可以在顶点做颜色的计算
一个模型的像素较少(离摄像机远 透视投影的情况下)可以在顶点做颜色的计算
考虑美观 就和上面的做法相反就行了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值