Unity Shader总结(四)——光照模型

自发光: c e m i s s i v e c_{emissive} cemissive
高光发射: c s p e c u l a r c_{specular} cspecular
漫反射: c d i f f u s e c_{diffuse} cdiffuse
环境光: c a m b i e n t c_{ambient} cambient

一、漫反射

1.1 兰伯特模型

c d i f f u s e = ( c l i g h t ⋅ m d i f f u s e ) m a x ( 0 , n ^ ⋅ l ^ ) c_{diffuse}=(c_{light}\cdot m_{diffuse})max(0,\widehat{n}\cdot \widehat{l}) cdiffuse=clightmdiffusemax(0,n l )
其中, c l i g h t c_{light} clight是光源颜色和强度, m d i f f u s e m_{diffuse} mdiffuse是漫反射系数, n ^ \widehat{n} n 是表面法线, l ^ \widehat{l} l 是指向光源的单位矢向量。
m a x max max函数可以用 s a t u r a t e ( x ) saturate(x) saturate(x)函数实现。

实践

逐顶点:

Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex-Level" {
   
	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));
				// Get the light direction in world space
				//_WorldSpaceLightPos0是假设只有一个光源且是平行光
				fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
				// Compute diffuse term
				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal
### 使用 Unity Shader Graph 实现自定义光照模型Unity 中,Shader Graph 提供了一种直观的方式来构建和调整着色器效果而不需要编写复杂的 HLSL 或 CG 代码。以下是关于如何使用 Shader Graph 创建自定义光照模型的技术说明。 #### 准备工作 为了开始创建自定义光照模型,在启动项目之前应先熟悉 Shader Graph 的基本操作流程[^1]。这包括但不限于节点连接、属性配置以及材质预览等功能。如果尚未掌握这些基础技能,则建议查阅官方文档或其他入门教程作为补充学习资源。 #### 利用现有案例进行实践 对于希望深入理解并实际动手尝试的人来说,“Shader Graph Custom Lighting Sample Project”是一个非常有价值的参考资料[^2]。此项目不仅提供了完整的源文件下载链接,还附带详细的开发背景介绍和技术解析文章。通过研究该样本中的具体实现方法及其背后的设计理念,能够帮助快速上手复杂场景下的灯处理逻辑。 #### 渲染模式的选择与影响 当决定采用哪种类型的渲染管线时需考虑目标平台性能需求等因素。通常情况下可以选择两种主要的渲染路径之一——逐顶点或者逐片段(像素)级别上的计算方式来进行表面反射特性的模拟[^3]: - **逐顶点光照 (Per-Vertex Lighting)** : 更加高效但在某些细节表现方面可能有所欠缺; - **逐像素/片段光照 (Per-Fragment/Pixel Lighting)** :虽然消耗更多GPU资源但能提供更高质量的结果; 因此,在设计阶段就需要权衡两者之间的利弊关系,并据此做出合理决策以满足最终视觉呈现的要求。 #### 示例步骤概述 尽管不鼓励直接给出分步指导,但仍可简要描述几个关键环节以便于整体把握整个过程: 1. 打开新建好的Unlit Master Node 并切换至Lit Mode; 2. 添加必要的输入参数比如Normal Map, Albedo Color等等; 3. 构建核心算法部分涉及向量运算及颜色混合等操作; 4. 调整测试直至达到预期效果为止; 下面展示了一个简单的代码片段用于演示如何手动编辑HLSL函数从而引入外部源方向变量: ```hlsl float3 lightDir = normalize(_WorldSpaceLightPos0.xyz); ``` 请注意上述仅为示意用途的实际应用当中还需要综合考量其他多种因素才能完成全面的功能覆盖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值