阴影是怎么产生的,如何渲染出阴影

Shadow Mapping
假设要渲染以下场景

渲染场景2次:
1.第一次,产生一个shadow map,shadow map描述光源能照到的着色点.

2.从眼睛出发,从第一次渲染 shadow map中,看某个点是否在阴影里.

3. 再次渲染,我们渲染一个结果,比较深度。

好处:不再需要知道场景的几何信息
坏处:走样和锯齿

Shadow Mapping 的问题

问题一:渲染结果自遮挡
原因:我们对每一个场景的像素的深度,这个值是固定的。Shadow Map记录的深度不连续。且光线和场景的像素有夹角,也就是斜着照到像素上,Shadow Mapping 就会出现自遮挡现象。

解决方法:
如果光线打到像素上的时候夹角很大,我们Shadow Map中记录的深度和计算的深度加上偏移。光线和和着色点法线的夹角越大,偏移值越大。

问题二:引入问题一的方案后阴影不全

问题三:走样

如何渲染出好的阴影

预备知识:不等式
我们在实时渲染中,会把不等式在一定条件下,当做约等于用。

乘积的积分和积分的乘机近似

以上不等式什么时候可以近似相等:
1.实际的积分范围很小的时候,可以近似.
2.g(x)在积分域的范围内变化不大(min,max差别不).

1.面光源,光源没有什么变化
2.BRDF是一个diffuse的材质

PCSS算法(产生软阴影的方法)

Percentage Closer Filtering(PCF)**
第一:不是对已经存在的阴影做Filter
第二:不是对ShadowMap做Filter

PCF算法:
硬阴影:对任意一个着色点,计算它的阴影时候。比较shadow map中点和这个点的深度,看是否在阴影里。这种方式某个点的阴影只有0和1两种结果,也就是在阴影里面,或者不在阴影里面。这种方式产生的阴影叫做硬阴影
软阴影: 如果我们需要软阴影,那么我们这个点(某个着色点)需要和shadow map中的一个点比较。同时和shadow map中这个点附近的 7 * 7(除去该点)个点比较深度。那么我们得到了很多49个值(这些值是0或者1) 加权平均,就得到了一个在0~1之间的数值。那么这个值就可以代表阴影有多"软",越接近0,越软,越接近1,越硬。
PCF的效果:

什么时候是软一些,什么时候硬一些

Percentage Closer Soft Shadows (PCSS)**
距离遮挡物越近,阴影越硬,距离遮挡物越远,阴影越软。我们需要计算一个相对的平均的遮挡物和阴影的投射物之间的距离。

下图是光线,遮挡物(Blocker),阴影接收物(Receiver)和阴影的软硬关系。我们用这个计算的结果来确定过滤时候的核多大。PCF算法中 77 还是 33。

算法的核心:
第一步:记录一个shading point的遮挡物的平均深度(计算多大的区域内遮挡物?)
第二步:计算Filter的大小
第三步:PCF算法

找多大的区域?在着色点,连向光源,形成一个椎体,在这个椎体中去找blocker,再去找平均深度。

截图和公式来源闫令琪老师games202课程
感谢闫令琪老师为我们带来这么精彩的图形学课程
https://www.bilibili.com/video/BV1YK4y1T7yY?p=4&spm_id_from=pageDriver

计算机图形学--阴影1--PCSS算法相关推荐

  1. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  2. 计算机图形学椭圆_椭圆算法| 计算机图形学

    计算机图形学椭圆 椭圆的性质 (Properties of ellipse) Ellipse is defined as the locus of a point in a plane which m ...

  3. 计算机图形学阴影的的分类,计算机图形学8_光照模型与阴影处理_.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp图形图像 计算机图形学8_光照模型与阴影处理_.pdf5页 本文 ...

  4. 计算机图形学 Bresenham直线生成算法

    bresenham算法是一种光栅化的直线生成算法,是计算机图形学目前使用广泛的直线扫描转换算法,具体逻辑很简单,就是描点.所以bresenham的算法研究实际上是研究目标点的选择. 实验环境: ope ...

  5. 计算机图形学 之 DDA直线算法(数值微分法)

    1. 直线段的扫描转换算法 在数学上,直线就是由无穷多个点组成的, 在计算机屏幕显示的话, 需要做一些处理,对于光栅显示器 光栅显示器上就是用有限多个点去逼近直线, 那么这些有限个点,我们需要知道每一 ...

  6. 13、计算机图形学——阴影贴图

    一.图形学中阴影的产生原理 阴影产生的原因就在于相机能看到的地方而光源无法照射到,所以,基于此,就有了下面的过程 首先从光源的方向放一个相机,进行一次透视投影,但是,只保存透视投影后深度信息 然后,从 ...

  7. java实现计算机图形学中点画线算法

    代码:DrawLine.java: import javax.swing.*; import java.awt.*;public class DrawLine extends JPanel {publ ...

  8. 计算机图形学——阴影

    阴影 投影阴影 我们我们根据点光源和多边形进行相似变换,通过变换矩阵实现,前提是我们只能投影到一个平面上.比如草原上的人的影子,马的影子,只要是影子都投影到草原上可以用到. 阴影体 首先要计算出处于阴 ...

  9. 计算机图形学 OpenGl-种子填充算法画红黄绿交通灯

    一.实验原理 我就不多叙述了,课本上说的已经够多了,其次我自己也是借鉴别人的代码写出来的 二.上机环境 VS2010 三.代码运行效果 四.完整代码 #include <GL/glut.h> ...

最新文章

  1. 关于GCD多任务处理
  2. 直接用Win32 API创建对话框Demo
  3. 还不知道 Redis 分布式锁的背后原理?还不赶快学习一下
  4. [OS复习]设备管理1
  5. Check for Palindromes(算法)
  6. 使用Eclipse连接SAP Netweaver系统遇到的错误消息和解决办法
  7. Vue之实例的生命周期
  8. 推荐20款基于 jQuery CSS 的文本效果插件
  9. MVC中使用KindEditor
  10. 生成N位的数字英文随机混合的字符串
  11. 基于Java Swing的进销存管理系统
  12. 一文带你了解SpringMVC框架的基本使用(上)
  13. 关于卫星定位,你想知道的一切
  14. web学习一——We简介、Tomcat、HTTP协议
  15. Scrum之团队绩效评估
  16. 滑滑的、嫩嫩的、又一种美观的字体效果做法!
  17. esp8266学习笔记(5)——连接wifi、AP、UDP通信
  18. mysql建表语句enum_mysql创建表语句格式
  19. C语言求任意四边形面积和其关联的三角形面积的关系
  20. UE4 AndroidSDK配置

热门文章

  1. C++查缺补漏之异常(续)
  2. 如何借助psacct或acct工具监视用户活动
  3. Java毕设项目小区停车场管理系统(java+VUE+Mybatis+Maven+Mysql)
  4. linux无线wps连接wifi,通过Wi-Fi保护的设置(WPS)设置无线连接在RV系列路由器
  5. GARP和GVRP的简介
  6. [USACO12JAN][SPOJ10502][Luogu3041]Video Game Combos
  7. 已知基点的经纬度,根据方位角和运动距离求另外一点的经纬度
  8. 阿里云相关-智能接入网关
  9. 电子管晶体管电视机收音机录音机电路图
  10. UGUI 多音字项目中用到多音字 奈何拼音字体库并非支持多音字,随便写了小工具类