Direct3D 12——灯光——聚光灯光

news2024/9/28 17:26:16

一个与聚光灯光源(spotlight)相近的现实实例是手电筒。从本质上来说,聚光灯由位置Q向方向d 照射出范围呈圆锥体的光。
在这里插入图片描述
一个聚光灯以位置Q向方向d发射出半顶角为Φmax 的圆锥体范围的光

其中,P为被照点的位置,Q是聚光灯的位置。 观察图可知,当且仅当位于 -Ld 之间的夹 角。小于圆锥体的半顶角Φmax时,P才位于聚光灯 的圆锥体范围之中(所以它才可以被光照射到)。 而且,聚光灯圆锥体范围内所有光线的强度也不尽 相同。位于圆锥体中心处的光线(即Qd这条向量 上的光线)光强应该是最强的,而随着角Φ由 0 增加至Φmax ,光强会逐渐趋近于0。
那么,怎样用与Φ相关的函数来控制光强的衰减 我们可以使用与图中曲线相同的函数,但是要以Φ替换θh ,再用s代替m:

在这里插入图片描述
这正是我们所期待的公式:光强随着Φ的增加而连续且平滑地衰减。另外,通过修改幕、s,我们就 能够间接地控制Φmax(使光强降为0的半顶角角度)。也就是说,我们可以通过设置不同的s值来缩小或 扩大聚光灯光源的圆锥体照射范围。例如,如果设s = 8,则圆锥体的半顶角就逼近45。
将光源的直射光量与衰减因子相乘之后,还要根据被照射点位于聚光灯圆锥体的具体位置, 用聚光灯因子kspot按比例对光强进行缩放。

实现

//实现了一种线性衰减因子的计算方法,可将其应用于点光源于聚光灯
float CalcAttenuation(float d, float falloffStart, float falloffEnd)
{
    // Linear falloff.
    return saturate((falloffEnd-d) / (falloffEnd - falloffStart));
}

//代替菲涅尔方程的石里克近似。此函数基于光向量L于表面法线n之间的夹角,并根据菲涅尔效应近似地计算出以n为法线的表面所反射光的百分比
// Schlick gives an approximation to Fresnel reflectance (see pg. 233 "Real-Time Rendering 3rd Ed.").
// R0 = ( (n-1)/(n+1) )^2, where n is the index of refraction.
float3 SchlickFresnel(float3 R0, float3 normal, float3 lightVec)
{
    float cosIncidentAngle = saturate(dot(normal, lightVec));

    float f0 = 1.0f - cosIncidentAngle;
    float3 reflectPercent = R0 + (1.0f - R0)*(f0*f0*f0*f0*f0);

    return reflectPercent;
}

//计算反射到观察者眼中的光量,该值为漫反射光量于镜面反射光量的总和
float3 BlinnPhong(float3 lightStrength, float3 lightVec, float3 normal, float3 toEye, Material mat)
{
    //m由光泽度推导而来,而光泽度则根据粗糙度求得
    const float m = mat.Shininess * 256.0f;
    float3 halfVec = normalize(toEye + lightVec);

    float roughnessFactor = (m + 8.0f)*pow(max(dot(halfVec, normal), 0.0f), m) / 8.0f;
    float3 fresnelFactor = SchlickFresnel(mat.FresnelR0, halfVec, lightVec);

    float3 specAlbedo = fresnelFactor*roughnessFactor;

    //尽管我们进行的是LDR(low dynamic range .低动态范围)渲染,但spec(镜面反射)公式得到
    // 的结果仍会超出范围[0,1],因此现将其按比例缩小一些
    // Our spec formula goes outside [0,1] range, but we are 
    // doing LDR rendering.  So scale it down a bit.
    specAlbedo = specAlbedo / (specAlbedo + 1.0f);

    return (mat.DiffuseAlbedo.rgb + specAlbedo) * lightStrength;
}

//聚光灯
float3 ComputeSpotLight(Light L, Material mat, float3 pos, float3 normal, float3 toEye)
{
    //从表面指向光源的向量
    // The vector from the surface to the light.
    float3 lightVec = L.Position - pos;

    //由表面到光源的距离
    // The distance from surface to light.
    float d = length(lightVec);

    //范围检测
    // Range test.
    if(d > L.FalloffEnd)
        return 0.0f;

    //对光向量进行规范化处理
    // Normalize the light vector.
    lightVec /= d;

    //通过朗伯余弦定律按比例缩小光的强度
    // Scale light down by Lambert's cosine law.
    float ndotl = max(dot(lightVec, normal), 0.0f);
    float3 lightStrength = L.Strength * ndotl;

    //根据距离计算光的衰减
    // Attenuate light by distance.
    float att = CalcAttenuation(d, L.FalloffStart, L.FalloffEnd);
    lightStrength *= att;

    //根据聚光灯照明模型对光强进行缩放处理
    // Scale by spotlight
    float spotFactor = pow(max(dot(-lightVec, L.Direction), 0.0f), L.SpotPower);
    lightStrength *= spotFactor;

    return BlinnPhong(lightStrength, lightVec, normal, toEye, mat);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于html+css的盒子展示8

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

一文4000字使用JavaScript+Selenium玩转Web应用自动化测试

自动化测试 在软件开发过程中, 测试是功能验收的必要过程, 这个过程往往有测试人员参与, 提前编写测试用例, 然后再手动对测试用例进行测试, 测试用例都通过之后则可以认为该功能通过验收. 但是软件中多个功能之间往往存在关联或依赖关系, 某一个功能的新增或修改可能或影响到…

手把手教你搭建ROS阿克曼转向小车之(霍尔编码器数据读取与速度计算)

上一篇文章已经介绍了如何驱动直流有刷电机转动起来,这篇文章讲解如何获取编码器的计数值,并且计算出速度信息。在实际的运行中,随着机器的重量不一样,电机受到的阻力就会不一样,给定同样的PWM在不同载重的情况下速度会…

Alien Skin ExposureX8最新ps中文版调色滤镜插件

Exposure是用于创意照片编辑的最佳图像编辑器。Exposure结合了专业级照片调整,庞大的华丽照片外观库以及高效的设计,使其使用起来很愉悦。新的自动调整功能可简化您的工作流程,并使您进入创意区。 Alien Skin Exposure 拥有超过500种预设效果…

基于线性支持向量机的词嵌入文本分类torch案例

一、前言 简介线性支持向量机,并使用线性支持向量机实现文本分类, 输入文本通过词嵌入方法转换成浮点张量,给出torch案例 线性支持向量机(Linear Support Vector Machine,简称Linear SVM)是一种常用的分类算法,它通过一个超平面来…

TiDB实战篇-TiDB Cluster部署

简介 部署TiDB Cluster部署,熟系集群的基础操作。 集群规划 机器拓扑 3pd,3tikv,1tidb_server.1tiflash,监控。 192.168.66.10192.168.66.20192.168.66.21 pd_servers tikv_servers tidb_servers tiflash_servers pd_servers tikv_servers monitoring_servers…

MySQL中使用IN()查询到底走不走索引?

MySQL中使用IN()查询到底走不走索引? 看数据量 EXPLAIN SELECT * from users WHERE is_doctor in (0,1); 很明显没走索引,下面再看一个sql。 EXPLAIN SELECT * from users WHERE is_doctor in (2,1);又走索引了,所以…

Yolov5一些知识

1 Yolov5四种网络模型 Yolov5官方代码中,给出的目标检测网络中一共有4个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。 1.1Yolov5网络结构图 eg:Yolov5s 2.1 Yolov3&Yolov4网络结构图 2.1.1 Yolov3网络结构图 Yolov3的网络结构是…

Matlab论文插图绘制模板第86期—带置信区间的折线图

在之前的文章中,分享了很多Matlab折线图的绘制模板: 进一步,分享一种特殊的折线图:带置信区间的折线图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行…

【C++技能树】快速文本匹配 --正则表达式介绍与C++正则表达式使用

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 0.正则表达式存在必要性 在日常生活,或者刷题过程中我们难免需要检测一段字符是否需要是否符合规定,或在一大段字符中寻找自己想要的信息…

Mysql 数据库介绍

数据库介绍 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API接口用于创建,访问,管理,搜索和复制所保存的数据。 我们也可以将数据存储在文件中&#xff0…

支持m2的主板换m2硬盘无法识别的问题,主板:七彩虹H410-T

记录一下我的电脑换m2硬盘遇到无法读取的问题,也给有同样问题的人留个参考,特别是七彩虹主板 主板:七彩虹H410-T 遇到的问题: m2 硬盘插上主板后,开机无法识别,打开我的电脑没有相应的盘,设备…

代码随想录---142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整…

【C++】vector的实现

模拟实现vector类前言一、迭代器二、重载 [ ]三、构造函数相关(重点)(1)构造函数(2)构造并使用n个值为value的元素初始化(3)区间构造(4)拷贝构造三、析构函数…

什么是科学

人人都是价值观-思辨专家_个人渣记录仅为自己搜索用的博客-CSDN博客 相关文章 人人都是中医爱好者 科学定义 关于“科学”这个词的定义,历史上曾出现过多种版本,但是目前为止还没有一个是世人公认的定义。 历史上达尔文(Charles Robert Darwin&#xff…

利用阿里云免费部署openai的Chatgpt国内直接用

背景 国内无法直接访问ChatGPT,一访问就显示 code 1020。而且最近OpenAI查的比较严格,开始大规模对亚洲地区开始封号,对于经常乱跳IP的、同一个ip一堆账号的、之前淘宝机刷账号的,账号被封的可能性极大。 那么有没有符合openai规定…

< element-Ui表格组件:表格多选功能回显勾选时因分页问题,导致无法勾选回显的全部数据 >

文章目录👉 前言👉 一、解决思路👉 二、实现代码(仅供参考,具体问题具体分析)> HTML模板> Js模板往期内容 💨👉 前言 在 Vue elementUi 开发中,elementUI中表格在…

Linux服务器怎么修改系统时间

Linux服务器怎么修改系统时间 linux服务器的系统时间,有的时候会产生误差,导致我们的程序出现一些延迟,或者其他的一些错误,那么怎么修改linux的系统时间呢? 我是艾西,今天又是跟linux小白分享小知识的时间…

C语言函数大全-- l 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- l 开头的函数 1. labs&#xff0c;llabs 1.1 函数说明 函数声明函数功能long labs(long n);计算长整型的绝对值long long int llabs(long long int n);计算long long int 类型整数的绝对值 1.2 演示示例 #include <stdio.h> …

Python-Python基本用法(全:含基本语法、用户交互、流程控制、数据类型、函数、面向对象、读写文件、异常、断言等)

1 环境准备 编辑器&#xff1a;Welcome to Python.org 解释器&#xff1a;pycharm&#xff1a;Thank you for downloading PyCharm! (jetbrains.com) 2 Quick start 创建项目 new project create demo print(Dad!!)3 基本语法 3.1 print 直接打印 print(Dad!!)拼接打印…