计算机图形学入门16:阴影映射

1.前言

        前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照,但是着色并不会进行阴影的计算,阴影需要单独进行处理,目前最常用的阴影计算技术之一就是Shadow Mapping技术,也就是俗称的阴影映射技术。

2.阴影映射

        Shadow Mapping是一种图像空间的算法。所谓图像空间就是使用Shadow Mapping在生成阴影的这一步,是不需要考虑场景中几何信息的。Shadow Mapping还会产生走样现象。

        Shadow Mapping最重要的核心思想是:不在阴影中的点必须同时被光线和相机看到。

2.1 阴影映射过程

        1.先从光源看向场景,得到深度图。如下图所示,在一个点光源位置上放一个虚拟的相机看向场景,做一遍光栅化得到光源能看到的图,这张图不需要着色,只需要把深度记录下来即可,此时得到的这个深度图即为Shadow Map

        2.从相机视角渲染场景,得到对应深度图对应深度值。如下图所示,从相机视角渲染场景,将所有相机视角可见的点,利用光源视角下的那一套投影矩阵的逆矩阵,将坐标从世界坐标转换到光源视角的空间坐标,得到光源视角下的深度值,并找到在深度图上对应的深度值。

        如果该点投影回光源视角的实际深度值不大于在深度图上对应的深度值(注意这里的深度值是浮点数,因为精度问题难以比较两个值相等),则说明此点可被光源照射,因此不在阴影中,如上图黄色线的这种情况。

        如果该点投影回光源视角的实际深度值大于在深度图上对应的深度值,则说明该点前方有物体遮挡,因此在阴影中,如上图红色线这种情况。

        这样就能判断哪些像素在阴影中了。下面举一个例子,如下图所示,是一个生成了阴影的场景。

        先来比较有阴影和无阴影的区别,如下图所示。

        从光线角度看生成的Shadow Map如下图所示。距离光源越近代表深度越小,所以颜色越黑,反之亦然。

        将相机视角方向渲染的投影到光源视角,通过深度图得到对应的深度值。如下图所示,球上对应的阴影信息看起来很脏,那是因为判断浮点数相等是很难的,只能判断大于。还会存在精度和走样的问题。

2.2 Shadow Map的问题

        1.Shadow Map只能产生硬阴影(Hard Shadows)。虽然有其他办法可以用来生成软阴影(Soft Shadows),但是理论上只用来生成硬阴影,只适用于没有体积的点光源。

        软硬阴影区别示意如下,上方棱角分明为硬阴影,下方为软阴影。软阴影效果更加真实。

        产生这种问题的原因是因为光源具有体积,导致有的地方完全看不到光源(本影, Umbra),有的地方能看到一部分光源(半影,Penumbra)。所以阴影的边缘在本影与半影之间会有过渡的情况,从而产生软阴影现象,就像上图中太阳与地球的角度导致的日食现象一样。所以点光源也无法产生软阴影,因为点光源没有体积大小。

        2.阴影质量取决于Shadow Map的分辨率。分辨率越高性能消耗也更多。

        3.涉及相等比较的浮点深度值意味着尺度、偏差、容差等问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络协议】精讲ARP协议工作原理!图解超赞超详细!!!

亲爱的用户,打开微信,搜索公众号:“风云说通信”,即可免费阅读该文章~~ 目录 前言 1. ARP协议介绍 1.1 ARP协议功能 1.2 ARP请求报文 1.3 ARP工作原理 2. ARP 缓存超时 2.1 RARP 3. ARP 攻击 3.1 ARP 攻击分类 前言 首先…

C++(part2、3-Linux系统编程+数据库项目):Linux网络云盘

文章目录 一、项目需求分析1.一期:命令行解析(1)cd(用栈管理)、ls、pwd(2)puts、gets(3)mkdir、touch、rmdir、rm 2.二期:密码验证、日志、断点续传、大文件传输(1)密码验证(2)日志(3)断点续传(4)大文件传输 3.三期:用户注册、用户登录、虚拟…

生命在于学习——Python人工智能原理(4.2)

三、Python的数据类型 3.1 python的基本数据类型 特点: 表示单一的、原子性的数据。 不可再分,是语言内建的最基本的数据类型。 存储的是简单的数值、字符、布尔值等。 在内存中通常占据固定大小的空间。 Python提供了整数、浮点数和复数三种数字类型和…

JavaScript的学习之事件的简介

目录 一、事件是什么 二、如何处理事件 一、事件是什么 定义:事件就是浏览器和用户之间的交互行为。 例如:点击按钮、鼠标移动、关闭窗口等。 二、如何处理事件 我们可以在对应的事件属性中设置一些JS行为,当事件触发的时候会将这些代码执行…

QT拖放事件之三:自定义拖放操作-利用QDrag来拖动完成数据的传输

1、运行效果 1)Qt::MoveAction 2)Qt::CopyAction 2、源码 #include "Widget.h" #include "ui_Widget.h" #include "common.h"

pyhon模块以及常用的第三方模块

import my_info as info print(info.name) info.show()from my_info import * print(name) show() pyhon中包的导入 import admin.my_admin as ad # 包名.模块名 admin是包名,my_admin是模块名print(ad.name) print(ad.info())from admin import my_admin as ad # …

[RPI4] 树莓派4b安装istoreos及使用 -- 1. 系统安装

最近在研究家庭智能化的一些东西,其中包括网络,智能家居等一系列内容,然后看过的资料有的想再回来看的时候就找不到了,然后就想着开这么一个系列,做一些记录,先从智能家居开始吧。 1 安装istoreos系统 iStoreOS 目标是提供一个人人会用的路由兼轻 NAS 系统,不管是作为路…

【本地知识库】本地知识库+语言大模型=知域问答

本地知识库语言大模型知域问答 本项目实质为本地知识库构建及应用,内容包含: 本地知识库构建及应用相关知识的介绍离线式本地知识库构建及应用在线式本地知识库构建及应用 本地知识库构建及应用相关知识的介绍 本地知识库 本地知识库通常是指存储在…

主播美颜工具背后的技术:视频直播美颜SDK详解

美颜效果是如何实现的呢?其中的关键技术就是视频直播美颜SDK。本篇文章,笔者将详细为您解答美颜SDK的核心技术和实现原理,探讨其背后的秘密。 一、美颜SDK的基本原理 美颜SDK的这些功能依赖于图像处理和计算机视觉技术,通过对视…

Java 8 Date and Time API

Java 8引入了新的日期和时间API,位于java.time包下,旨在替代旧的java.util.Date和java.util.Calendar类。新API更为简洁,易于使用,并且与Joda-Time库的一些理念相吻合。以下是Java 8 Date and Time API中几个核心类的简要概述&…

【服务器05】之【登录/注册账号成功转至游戏场景】

Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文,解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…

劳易测合作伙伴Pizzato P-KUBE Lite安全把手新品来袭!

劳易测合作伙伴Pizzato全新 P-KUBE 系列再添新成员!——P-KUBE Lite安全把手,进一步拓展了应用范围。新产品采用高聚酯材质制成,具备卓越的抗冲击性能,确保在严苛环境下把手的耐用性。把手的设计既符合人体工程学又兼具功能性&…

linux中的调试工具gdb

目录 1.背景知识补充 2.使用 知识补充 1.背景知识补充 1.gcc下编译默认是release方式发布的,无法直接进行调试 如果要以debug方式发布,需要携带-g 可以使用grep查询 因为携带debug信息,其文件体积要大一些 2.使用 1.gdb 可执行程序 …

elementplus el-table(行列互换)转置

Element Plus v2.4.0, repl v3.4.0 <template> <div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"名字" width"180" /><el-table-column prop"wei…

【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理

目录 一&#xff1a;请求方法 什么是请求方法&#xff1a; 常见请求方法如下 二&#xff1a;axios中应用 语法格式&#xff1a; 案例&#xff1a; axios错误处理 三&#xff1a;如何赚钱 一&#xff1a;请求方法 什么是请求方法&#xff1a; 浏览器对服务器资源&…

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点&#xff0c;一是组件的状态切换与buffer的流转过程&#xff0c;这部分内容我们已经在IL Spec中学习过了&#xff1b;二是OMX组件使用的buffer类型与buffer分配过程&#xff0c;这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

提取图像主色调

依赖 Pillow 库。 提取图像主色调&#xff0c;直接上代码&#xff1a; from PIL import Imagedef extract_main_color(img_path: str, delta_h: float 0.3) -> str:"""获取图像主色调Args:img_path: 输入图像的路径delta_h: 像素色相和平均色相做减法的绝…

17.RedHat认证-Ansible自动化运维(下)

17.RedHat认证-Ansible自动化运维(下) 这个章节讲ansible的变量&#xff0c;包括变量的定义、变量的规则、变量范围、变量优先级、变量练习等。 以及对于tasks的控制&#xff0c;主要有loop循环作业、条件判断等 变量 介绍 Ansible支持变量功能&#xff0c;能将value存储到…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…

MongoDB数据库的安装和删除

MongoDB数据库的删除和安装 1、删除MongoDB数据库2、下载MongoDB数据库1)、自定义安装2)、注意可视化可以取消勾选 1、删除MongoDB数据库 没有下载过的&#xff0c;可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过MongoDB数据库&#xff0c;要更换版本的话&#xff0c;其…