当前位置: 首页 > web >正文

4.6 多个光源

1.Include Files

2.The Second Light

3.Point Light


1.Include Files

为了在着色器中实现多光源支持, 我们需要添加更多通道; 这些通道会包含几乎相同的代码, 为了避免代码重复, 我们将着色器代码移到一个包含文件中; 与光照着色器相同的文件夹中创建一个后缀为.cginc的文件, 将光照着色器中从#pragma语句下方开始直到ENDCG

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


#include 文本替换, 将内容替换该文件中的shader代码

在这里插入图片描述

当我们的文件中包含了多个相同的其他文件时, 最终导致代码重复; 为了防止代码重复, 通常通过#define会对头文件进行定义检查保护, 这个定义只是一个与头文件名对应的唯一标识符

在这里插入图片描述


2.The Second Light

添加第二个光源, 该光源再次采用平行光, 进行如下设置:

在这里插入图片描述

虽然我们有两个平行光源, 但是视觉上并无差异; 两者同时激活时, 只有主光源才会产生实际影响

在这里插入图片描述

我们只能看到单一光源的影响, 是因为我们的shader设置的基础渲染通道, 基础渲染通道用于处理定向光; 如果要处理额外光源, 则需要添加一个附加渲染通道

在这里插入图片描述

现在我们看到的效果是第二个灯光生效, 想要的效果是第一个灯和第二个灯的叠加, 需要修改混合模式为Blend One One

在这里插入图片描述
在这里插入图片描述


由于第一个pass和第二个是对于相同的物体使用, 第一个pass已经将物体相关的深度写进深度缓冲区中, 因此第二个pass中我们无需再次写入Zwrite Off

在这里插入图片描述


3.Point Light

我们加入点光源, 关闭两个方向光源

在这里插入图片描述

1).Light Positon 光源位置a.对于方向光, _WorldSpaceLightPos0表示的是光线的方向b.对于点光源, _WorldSpaceLightPos0表示点光源的位置, 计算光线的方向需要用点光源的位置减去片元的世界坐标

在这里插入图片描述


2).Light Attenuation 光线衰减a.对于方向光而言, 知道其方向就足够, 它被假定位于无限远处b.对于点光源而言, 它具有明确位置, 它与物体表面的距离也会产生影响; 光线距离物体越远, 亮度就越弱, 这种现象被称为光线衰减c.对于平行光源, 其衰减变化极其缓慢, 可视为恒定值, 无需特别处理; 但点光源的衰减是如何的?想象一个点向所有方向瞬间发射出光子, 这些光子以相同速度向外移动, 随着时间的推移, 它们与中心点的距离不断增加; 这些光子构成了一个以该点为中心的球面, 随着光子持续运动, 这个球体的半径不断扩大; 球体表面积随之增长, 但包含的光子总数保持不变, 因此光子密度逐渐降低 - 这决定了我们观测到的光线亮度 

在这里插入图片描述

3).光源衰减因子半径为r的球体表面积公式为4πr^2, 为计算光子密度, 可用该值作为分母, 常数项4π可以忽略不计, 最终得到的衰减系数为1/d^2, 其中d表示光源距离

在这里插入图片描述

在这里插入图片描述

上面计算光照衰减因子1 / d^2存在一个问题, 当光源到物体表面的距离趋近于零时, 衰减因子会急剧增至无限大; 为了确保光线在零距离时强度达到最大值, 需将衰减方程修改为:1 / (1 + d^2)

在这里插入图片描述

http://www.xdnf.cn/news/20536.html

相关文章:

  • 【数论】P10580 [蓝桥杯 2024 国 A] gcd 与 lcm|普及+
  • MapStruct详解
  • Linux RCU (Read-Copy-Update) 机制深度分析
  • leetcode 912 排序数组(快速排序)
  • 【CV】Opencv图像处理——①几何变换 (1)
  • 神马 M66S+ 282T矿机参数详解:SHA-256算法与Hydro冷却技术
  • 贪心算法应用:食品生产线排序问题详解
  • 继承详解(c++)
  • langchain源码概览
  • Java全栈开发面试实录:从基础到实战的深度解析
  • 【牛客刷题-剑指Offer】BM18 二维数组中的查找:一题四解,从暴力到最优
  • Python元组:不可变但灵活的数据容器
  • LwIP入门实战 — 3 以太网外设 (ETH)
  • 什么是JQ
  • solidity函数篇2
  • Netty从0到1系列之EventLoop
  • 魅族 Note 16 解锁 BL 及 Root 官方刷机包下载Flyme 12.0.1.5A 型号 M521Q
  • 基于SVN搭建企业内部知识库系统实践
  • 试用电子实验记录本ELN的经验之谈
  • 【算法】92.翻转链表Ⅱ--通俗讲解
  • Vue 3项目中引用ECharts并设计多种图表组件的实现方案
  • 行政区划编码树形题解
  • 09_多态
  • `IntersectionObserver`延迟加载不在首屏的自动播放视频/图片/埋点/
  • Boost电路:稳态和小信号分析
  • Linux匿名管道和命名管道以及共享内存
  • C++并发编程指南 递归锁 介绍
  • Kimi K2-0905 256K 上下文 API 状态管理优化教程
  • 2.虚拟内存:分页、分段、页面置换算法
  • 分享一个基于Python+大数据的房地产一手房成交数据关联分析与可视化系统,基于机器学习的深圳房产价格走势分析与预测系统