《Unity Shader入门精要》自学笔记(七)第九章 更复杂的光照 ——光照衰减

帧调试器FrameDebugger

又是一个好玩的小玩具好用的小工具呢!
可以通过Window → Analysis → Frame Debugger打开
然后点击左上角的Enable,就可以查看了
在这里插入图片描述
点击1打开或关闭Frame Debugger
滑动2一步一步查看渲染过程
点击3切换显示渲染效果和shader中的属性值(对于纹理,可以ctr + 鼠标左键查看大图)
点击4查看每个步骤的状态

目前只要知道这些就可以了,Frame Debugger的更多玩法详情见Unity User Manual (2019.4 LTS)Graphics Optimizing graphics performanceFrame Debugger

Unity中的光源

Unity中光源的属性

Light组件中的3个属性

  1. 颜色(Color)
  2. 强度(Intensity)
  3. 衰减(Attenuation):Unity光源的Inspector面板中,使用该光源可以照亮的半径Range来表示

以及Transform组件中的两个属性

  1. 位置(Position):与衰减、强度参数一起计算到达顶点的光照强度
  2. 方向(Direction):与到达顶点的光照强度、光照颜色等属性计算顶点接受的光照

上面的5个属性用一个可以调节亮度的手电筒来理解就再简单不过了

  1. 颜色:手电筒的灯泡可以是白色,也可以是浅蓝色,还可以是骚气的绿色,它们打在物体上(比如白色的墙面)会有不同的效果
  2. 强度:手电筒可以调节不同的亮度档次,光打在物体上的效果也会不一样
  3. 衰减&位置:拿着手电筒靠近或远离物体,光打在物体上的效果也会不一样
  4. 方向:向左或右迈一大步,但手电筒还是打在之前的位置上,相当于改变了光照的方向,效果也会不一样

Unity中的4种光源类型

  1. 平行光(Directional Light)
    最简单粗暴的光源:对所有点的方向、强度都一样,不受位置、衰减参数的影响
    举例:太阳
    影响属性:颜色、强度、角度
  2. 点光源(Point Light)
    由空间球体定义,由一个点发出的、向所有方向延伸的光,不受角度属性影响
    举例:蜡烛、星星点点的装饰灯
    影响属性:颜色、强度、衰减(Inspector中,使用该光源可以照亮的区域的半径Range来表示)、位置
  3. 聚光灯(Spot Light)
    在点光源的基础上,限制了光线发出的方向范围为一个锥形区域,需要额外计算来判断一个点是否在锥形区域内(是否被照亮)
    举例:手电筒、舞台聚光灯
    影响属性:颜色、强度、衰减、位置、方向、锥形区域打开的角度(Spot Angle)
  4. 面光源(Area Light)
    烘焙光源:只在烘焙时有效

在Unity的前向渲染中获得光源的属性

准备工作

SubShader{
   
	Tags{
   "RenderType" = "Opaque"}

	Pass{
   
		Tags{
   "LightMode" = "ForwardBase"} // ForwardBase Pass

		CGPROGRAM
		#pragma multi_compile_fwdbase // 正确赋值一些内置变量			
		#pragma vertex vert
		#pragma fragment frag
		#include "Lighting.cginc"
		// ...
		ENDCG
	}

	Pass{
   
		Tags{
   "LightMode" = "ForwardAdd"} // ForwardAdd Pass
		Blend One One // 注意开启混合,否则之前的渲染结果会被覆盖
		
		CGPROGRAM
		#pragma multi_compile_fwdadd // 正确赋值一些内置变量
		#pragma vertex vert
		#pragma fragment frag
		#include "Lighting.cginc"
		#include "AutoLight.cginc"
		// ...
		ENDCG
	}
	FallBack "Specular"
}

接下来看之前最常用到的平行光,在ForwardBase Pass中片元着色器的代码

fixed4 frag(v2f i) : SV_Target {
   
	// 方向(平行光位置参数无效,_WorldSpaceLightPos0.w = 0,_WorldSpaceLightPos0.xyz中存储rotation)
	fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
	fixed3 worldNormal = 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值