一、点光源、聚光灯的特点

关于点光源和聚光灯的特点,可以参考下面的文章,只需要关心理论部分就ok了

  1. 点光源:https://blog.csdn.net/Jaihk662/article/details/106722949
  2. 聚光灯:https://blog.csdn.net/Jaihk662/article/details/106770741
  3. Unity中的前向渲染:https://blog.csdn.net/Jaihk662/article/details/112055588

还是需要提前了解下的

二、在UnityShader中实现点光和聚光

代码在前向渲染这一章中就有,主要还是关于衰减的计算:

#ifdef USING_DIRECTIONAL_LIGHTfixed atten = 1.0;
#else#if defined (POINT)//unity_WorldToLight在AutoLight.cginc文件中的特定宏下被定义,可以用于把点从世界空间变换到该光源的局部空间下float3 lightCoord = mul(unity_WorldToLight, float4(i.wPos, 1)).xyz;//UNITY_ATTEN_CHANNEL是衰减值所在的纹理通道,可以在内置的HLSLSupport.cginc文件中查看,一般PC和主机平台的话UNITY_ATTEN_CHANNEL是r通道,移动平台的话是a通道fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;#elif defined (SPOT)float4 lightCoord = mul(unity_WorldToLight, float4(i.wPos, 1));//若不在聚光灯的照射方向,就当然没有光照fixed atten = (lightCoord.z > 0) * tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;//对于聚光灯,_LightTexture0存储的不再是基于距离的衰减纹理,而是一张基于张角范围的衰减纹理atten *= tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w;#elsefixed atten = 1.0;#endif
#endif

可以看出 Unity 中使用一张纹理作为查找表在片元着色器中计算逐光照的衰减,这样就可以避免数学计算的复杂度,但是不是特别直观,并且数据大多数是要预处理定死的

三、光的衰减

对于点光源,需要考虑距离衰减,而对于聚光灯,不但需要考虑距离衰减,还需要考虑张角衰减

1):距离衰减与距离衰减纹理:

前一章提到过,在点光源的情况下,基于到点光源中心距离的衰减纹理被存储在了 _LightTexture0 中,而在聚光灯的情况下,这张纹理被存储在了 _LightTextureB0 中

一般来讲,只需要考虑其对角线上的纹理颜色值就可以了,所以采样时 uv 坐标相同,也可以将衰减纹理理解为是一个一维纹理

2):投影纹理(cookie):

什么是 cookie 纹理,下面的例子一看就明白,这是一个“窗口”的投影纹理和它的应用

计算张角衰减时,需要用到它

3):关于张角衰减的计算

聚光灯是有一个发射方向的,当前片段到光源的方向与发射方向夹角越大光照就越弱,Unity 中,这个发射方向就是光源坐标系的 z 轴:

在上面的 shader 中,计算角度衰减的代码是这一句:

atten *= tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w;

根据 Unity 源码,我们可以得到的 _LightTexture0 的值为:

其中  为缩放, 为聚光灯切光角(半张角),可以参考下图(图中的  其实是 

这样的话,lightCoord.xy / lightCoord.w + 0.5 值就为 

这个公式就很有意思了,可以看出这又是 /2 + 1/2 的经典操作,也就是将原先 [-1, 1] 范围内置的 值映射到 [0, 1] 范围内,而这也正是纹理坐标的范围

而对于去掉映射计算后的值  正是当前片段到光源的 tan 值除以切光角 tan 值的结果,当这个值为 -1 或 1 时,说明当前片段刚好在投影范围的边界上,如果当前值为0,说明当前片段正对照射中心,若是超过了 [-1, 1] 的范围当然不受光照

那么拿到了这个被归入 [0, 1] 范围内的值后就可以从 cookie 中采样了,对应的 cookie 贴图如下:

一目了然

UnityShader16:点光源和聚光灯相关推荐

  1. unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

    200+篇教程总入口,欢迎收藏: 放牛的星星:[教程汇总+持续更新]Unity从入门到入坟--收藏这一篇就够了​zhuanlan.zhihu.com 本文重点内容: 1.支持更多类型的灯光 2.包含实 ...

  2. OpenGL(十二) 光源类型 平行光 、 点光源 、 聚光灯 的实现

    常规的 光源类型 有三种.最简单的自然是平行光.稍复杂些的为点光源,最复杂的为聚光灯.总体说来,在可编程管线中原理是一样的.在OpenGL代码中传入必要的参数,在shader中进行相关的计算绘制出效果 ...

  3. three.js+vue3+vite教学(九、环境光,点光源,聚光灯,平行光)

    环境光 添加环境光 // 添加环境光 const ambientLight = new AmbientLight(controlRef.value.ambientColor) scene.add(am ...

  4. opengl对三种光源(方向光,点光源,聚光灯)进行特写并分屏渲染

    分屏特写渲染效果图 实现原理 1,创建3个fbo 2,分别将方向光,点光源,聚光灯的照射效果渲染到fbo 3,在将渲染好的三个fbo作为纹理贴到要绘制的三个四边形上. 渲染入口 #include &l ...

  5. OpenGL基础24:聚光灯

    前置:OpenGL基础23:平行光与点光源 一.聚光灯 三种基础光源在上一章讲了2种,现在只剩下聚光灯了 手电筒就是一个很经典例子,相对于点光源,聚光灯拥有以下特点 依然有衰减,但是聚光灯的光照一般都 ...

  6. ThingJS加入聚光灯功能,开发更轻松

    聚光灯是最常使用的光源之一,特别是如果我们想要使用阴影的话.ThingJS场景效果加入聚光灯的功能,封装开发更轻松. 光源 (Lights) 是每个场景的重要组成部分.网格和纹理决定了场景的形状和外观 ...

  7. 手把手教你实现聚光灯效果

    聚光灯是一种特殊的点光源,它能够朝着一个方向投射光线.聚光灯投射出的是类似圆锥形的光线,这与我们现实中看到的聚光灯是一致的.其灯光从一点发出,沿着某一个方向照射出一个锥形光照范围.聚光灯近似于一个有夹 ...

  8. UnityShader17:光照属性与阴影

    前置:UnityShader16:点光源和聚光灯 一.一些重要的光照.阴影属性 一个一个来(绿色的部分暂时可以不用了解): Type:光照类型,除了常用的3个,还有一个面光源 Color:光照颜色 M ...

  9. 【逆向】UE4 渲染流程分析

    UE4作为当今商业引擎界的大佬,渲染和图形质量一直是首屈一指的水准,但是相对于unity来说UE4基本上是一套完整方案提供,不通过源码修改对渲染进行定制的可能性比较小,而且同时UE4这方面的文档很少, ...

最新文章

  1. vue 在浏览器控制台怎么调试 谷歌插件vue Devtools
  2. c语言中ai是什么,AICODE在C语言教学中应用研究.doc
  3. mysql选择table_mysql – 选择distinct table4_id,table3_id和table2_...
  4. sceneManager.loadscene加载场景时不会主动去加载场景的依赖包,要手动加载或添加场景到build setting列表中...
  5. IOS UISwitch 组件的使用
  6. 我的第一个 RN 项目-趣闻
  7. 知识蒸馏在广告系统中的应用(二)
  8. VMware Ubuntu虚拟机卡顿慢 解决方法大全
  9. 2.2 PHP7.2 狐教程-【PHP变量】
  10. SQL Where 字符串拼接
  11. 基于Debian的Linux发行版安装深度音乐及其插件,支持ubunut16
  12. 母版页与用户控件区别(思维导图整理)
  13. struts1——静态ActionForm与动态ActionForm
  14. 揭秘Apple Watch心率监测技术
  15. 乘法鉴相器的matlab仿真,基于COSTAS环的载波恢复技术
  16. bzoj2101: [Usaco2010 Dec]Treasure Chest 藏宝箱
  17. Android 利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)
  18. codeforces1463B. Find The Array
  19. 华为mate20 pro 专业模式拍照
  20. C#中Get和Set的用法

热门文章

  1. 2018年python工作好找吗-2018年最火的5大Python开源项目,总有适合你的!
  2. 没有计算机基础可以学python-学习第一天day1(计算机基础,及python基础)
  3. php和python-浅析PHP与Python进行数据交互
  4. 零基础学python-从0开始学Python,0基础小白
  5. python工资一般多少西安-Python面试经验分享——西安贝业思数据
  6. 叮当:一个开源的树莓派中文智能音箱项目
  7. linux 命令美丽,美丽的程序猿-Linux下那些查找文件的小技巧-find
  8. linux代码实现进程监控,linux进程监控shell脚本代码
  9. 【java笔记】线程(2):多线程的原理
  10. 【深度优先搜索】计蒜客:方程的解数