原文链接:https://blog.csdn.net/lawest/article/details/106364935

总结下来就是:

因为深度贴图的分辨率有限,导致多个像素点采样1个深度,导致阴影失真(acne)

1个解决方法是添加bias,也就是给像素的z加上偏移,这个方法会导致阴影悬浮(peter panning)

最好的解决阴影失真的方法是cull font,只渲背面的深度

可参考:https://zhuanlan.zhihu.com/p/45653702

---------------------

在之前学习阴影映射时看的是这篇文章https://learnopengl-cn.github.io/05 Advanced Lighting/03 Shadows/01 Shadow Mapping/。

但是里面有两个点当时是云里雾里,现在重新学习如何实现柔和边缘阴影时有又遇到些问题,就是在阴影映射是出现的shadow acne(阴影失真)和peter panning(阴影悬浮),

阴影失真如图:

出现这个问题的原因原文根本就没讲清楚,给出的图和解释也十分误导人,而且给出的解决方法也十分含糊,当时看的的怀疑人生,怀疑自己的智商,在终于搞懂之后我那个气啊,当时就把桌子给掀了。

会出现阴影失真的根本原因是所生成的深度贴图的分辨率是有限的,就会造成在fragment位置处取深度图中的值发生采样就会出现问题,这里我引用知乎用户王十一的回答用的图(懒得自己画)。如图:以四个格子为四个fragment为例,由于深度图分辨率有限四个格子会采样同一个深度值(由于纹理参数设置的是临近GL_NEAREST,设置线性也会有这个问题)。

如图假设采样这个四方格的正中心,假设这个深度值为10。

这四个fragment分别取名a,b,c,d,由于光源的位置会导致求得的四个距离会不一样,先求a到光源的距离假设为9.8<10,b到光源的距离是11.6 >10,c到光源的距离12.1>10,c到光源的距离9.5<10,。就会导致a和d亮,b和c暗,他们本来应该都是亮的才对。然后整个光源视椎体下各个片段都会出现这个问题,就会出现上面的明暗交错的条纹。

原文说的解决方法是将fragment到光源的距离适当的缩小bias,就会避免这个问题,但是这种解决方法会带来另外一个问题,那就是peter panning(阴影悬浮),bias越大悬浮的越厉害。

如果解决一个问题的方法会带来另外一个问题我们为什么要用呢?

glCullFace(GL_FRONT);
使用正面剔除来生成深度贴图可以解决正面的阴影失真,也就是说只有物体背面才会产生深度信息,向地板这种只有一个面的物体不会产生深度信息,这也是合理的,但是这也只能在封闭的物体上这么做,但是即使这样物体的背面还是会出现阴影失真,这时候可以用glPolygonOffset来解决这个问题,将深度图中的值稍微减小一点而不是片段到光源的距离,两者结合就可以解决这个问题。

shadow acne(阴影失真)和peter panning(阴影悬浮)相关推荐

  1. 关于阴影映射的那些事,shadow acne(阴影失真)和peter panning(阴影悬浮)

    在之前学习阴影映射时看的是这篇文章https://learnopengl-cn.github.io/05 Advanced Lighting/03 Shadows/01 Shadow Mapping/ ...

  2. OpenGL.Shader:12-阴影实现 - 解决阴影失真

    OpenGL.Shader:12-阴影实现 - 解决阴影失真 紧接上文的内容,那么怎么解决阴影失真的问题呢?这些问题其实都是不可回避的存在,现代技术只能尽量优化效果已达以假乱真的效果. 首先回到深度纹 ...

  3. AE插件:Shadow Studio for Mac(优雅漂亮真实阴影特效插件)

    Shadow Studio for Mac是一款非常酷的AE插件,可以模拟各种阴影样式.拥有柔和阴影,径向阴影,内部阴影,长阴影等多功能多线程插件,可实现最快速度渲染.使用传统方法实现光线跟踪等计算柔 ...

  4. (九)unity自带的着色器源码剖析之——————UnityShadowLibrary.cginc文件分析(实时阴影和烘焙阴影、阴影淡化、阴影渗漏处理、PCF阴影过滤解决实时阴影锯齿)

    一.阴影与全局照明系统的关系 Unity3D引擎可以根据宏SHADOWS_SCREEN和LIGHTMAP_ON是否启用决定是否在全局照明系统下对阴影进行混合处理.如果这两个宏同时启用,则HANDLE_ ...

  5. ue4场景没阴影_UE4 Mobile使用动态阴影的一些小结

    UE4在Mobile平台里,除了预先烘焙的静态阴影之外,对于动态物体一般使用两种阴影:调制阴影(Modulated Shadows)和级联阴影(Cascade Shadows,简称CSM). 调制阴影 ...

  6. visio任意区域填充斜线阴影_DX12渲染管线(6) - 级联阴影与距离场阴影

    接上一期: 膜力鸭苏蛙可:引擎搭建记录(5) - 距离场 : 建场​zhuanlan.zhihu.com 项目地址: MrySwk/GravityEngine​github.com 上一期,我们完成了 ...

  7. android 加阴影,Android设置控件阴影的三种方式

    释放双眼,带上耳机,听听看~! 第一种方式:elevation View的大小位置都是通过x,y确定的,而现在有了z轴的概念,而这个z值就是View的高度(elevation),而高度决定了阴影(sh ...

  8. html盒子阴影的语法,css3 盒阴影box-shadow

    1.描述: box-shadow可以设置一个或多个下拉阴影的框,此属性使用于盒模型不是用来设置文字阴影,设置文字阴影可以使用text-shadow 2.语法: box-shadow:h-shadow ...

  9. 文件用手机拍照片打印时,打印出来总是有黑阴影,如何去掉黑色阴影打印清晰的图片

    文件用手机拍照片打印时,打印出来总是有黑阴影,如何去掉黑色阴影打印清晰的图片 目录 文件用手机拍照片打印时,打印出来总是有黑阴影,如何去掉黑色阴影打印清晰的图片 1.将需要打印的图片复制粘贴至Word ...

最新文章

  1. Spring Boot req中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
  2. Python第五课(字典)
  3. mysql基础知识整理_mysql基础知识整理(一)
  4. Service order description modify and save
  5. Android onLoadFinished与onLoaderReset
  6. 搭建opencv环境
  7. Git 学习笔记--git 查看某个文件的修改历史
  8. 大背景在网页设计中应用的30个优秀案例
  9. php unset引用变量后不会删除值
  10. 电池充电器UL1310、启动电源UL2743、电脑风扇507测试报告怎么办理?
  11. centos7 yum 配置阿里云镜像
  12. 2017滴滴校招编程
  13. 7-7 阿泽的交友标准 (10 分)
  14. 中国传媒大学计算机课程表,中国传媒大学新闻学院课程表.doc
  15. HDFS性能压测工具
  16. 刚子扯谈:网站运营路在何方?
  17. 串口开发 打印机 读卡器 遇到的问题
  18. 香帅的北大金融学课笔记5 -- 基金分类
  19. 微信红包的随机算法是怎样实现的?
  20. python--ant环境搭建

热门文章

  1. 【眼镜片】绿膜和蓝膜有什么区别?
  2. 再次慨叹生命的脆弱,我辈当惜之
  3. 达人评测 i5 1155G7和i5 1135G7的差距大不大
  4. C#程序设计之windows应用程序设计基础
  5. 【Hgame2022】第一周misc和web题解
  6. [Android]朝花夕拾之使用DexClassLoader动态加载广点通jar包
  7. Python 安装wheel.whl文件
  8. 浅谈response.setHeader()用法
  9. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)
  10. PMP快速通过经验分享