热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

实时阴影渲染(三):软阴影深度校正

上一篇介绍的软阴影技术已经可以生成很好的软阴影再结合第一篇介绍的PSSM就可以实现不错的阴影效果但在实际应用中的会遇到一个很重要的问题:阴影渲染中的自阴影问题这种问题

上一篇介绍的软阴影技术已经可以生成很好的软阴影

再结合第一篇介绍的PSSM就可以实现不错的阴影效果

但在实际应用中的会遇到一个很重要的问题:阴影渲染中的自阴影问题

这种问题的产生的原因和锯齿原因类似:

视空间中的像素和灯光空间像素不一致

比如视空间中的一块区域(多个像素)在渲染阴影时对应同一个像素,因而仅产生一个深度值(中心深度)

对于灯光空间中倾斜的三角面来说,这些值是应该不同的

一般对这种问题的解决办法是通过一个小的深度偏移量,或者再通过背面渲染缓解这种问题

 而采用多个采样的深度软阴影技术,这种问题会更加显著,这样仅采用一个小小的偏移就不够了

但如果深度偏移太大又会导致本该出现阴影的地方没有阴影

 

下图以水平3像素的软阴影采样为例说明这种问题:

如上图,假设场景中仅存在ABC所在的平面,ABC为相邻的三个阴影像素,

采用水平3采样计算c点阴影时,会得到强度为0.333的阴影,因为 depth(a)>depth(c)+depthBias

这样渲染那出来的结果是:整个平面都在强度为0.333阴影中;而实际上整个平面都不应该有阴影

 除非我们将depthBias设的足够大,但AB平面越倾斜、采样数越多所需要的depthBias的值就越大

这样通过增大depthBias的值是不能解决问题的

 

思考一下,如果我们能知道ac点的深度差dz = depth(c)-depth(a)的值,就可以通过计算比较出:

  depth(a) - dz  <   depth(c)&#43;depthBias;

  depth(c)  <    depth(c)&#43;depthBias;

  depth(b) &#43; dz <  depth(c)&#43;depthBias;

从而得出整个平面都不在阴影中的结果

 

计算深度差dz

在GPU设计体系中&#xff0c;片段程序执行时并不知道其它片段的信息

但好在GPU的实现中提供了ddx ddy两个例外的指令&#xff0c;通过这两条指令可以得出相邻片段间的偏导&#xff0c;也就是相邻片段之间的数据差值

因为实际采样一般为3*3&#xff0c;5*5&#xff0c;我们需要计算水平和垂直两个方向上的深度差zx、zy

假设在当前片段所在三角面对应一个阴影纹理像素的深度差为float2(zx, zy), 阴影纹理宽高为float2(w,h)

通过求解二元一次方程组&#xff1a;

  ddx(uv) * float2(zx, zy) * float2(w,h)&#61; ddx(z)

  ddy(uv) * float2(zx, zy) *float2(w,h)&#61; ddy(z)

 就可以得到zx、zy

注&#xff1a;uv  为当前片段的深度纹理uv坐标&#xff0c; z 为当前片段深度值 &#xff0c;这些都是已知

 

2017-9-22修改&#xff1a; &#43;方程求解说明

之前的方程写的意思不明确&#xff0c;想表达的是:

    ddx(u)*zx*w &#43; ddx(v)*zy*h &#61; ddx(z)   即 x方向z变化量【ddx(z)】 &#61; x方向u变化量【ddx(u)】 * 单位u变化对应的z变化量【zx】 &#43;  x向v变化量【ddx(v)】 * 单位v变化对应的z变化量【zy】

    ddy(u)*zx*w &#43; ddy(v)*zy*h &#61; ddy(z)   同上

 

求解我就不写了&#xff0c;相当于求解 方程组&#xff1a;

a* zx &#43; b * zy &#61; c

d* zx &#43; e * zy &#61; f 即利用a b c d e f六个已知量&#xff0c;计算两个未知量zx\zy&#xff0c;但写出来挺长&#xff0c;还不如自己推导便于理解

 

 方程ddx(u)*zx*w &#43; ddx(v)*zy*h &#61; ddx(z) 成立的意思是&#xff1a;

当前片段x方向变化对应纹理坐标uv两个变化&#xff0c;而阴影纹理u、v的变化分别产生各自的z变化值&#xff0c;累加就是ddx(z)

 

转:https://www.cnblogs.com/wiki3d/p/shadow3.html



推荐阅读
  • 在探索 Unity Shaders 的过程中,我逐渐意识到掌握 OpenGL 基础知识的重要性。本文将详细介绍 OpenGL 的核心概念和基本操作,帮助读者从零开始理解这一图形编程技术。通过实例和代码解析,我们将深入探讨如何利用 OpenGL 创建高效的图形应用。无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 【高效构建全面的iOS直播应用】(美颜功能深度解析)
    本文深入探讨了如何高效构建全面的iOS直播应用,特别聚焦于美颜功能的技术实现。通过详细解析美颜算法和优化策略,帮助开发者快速掌握关键技术和实现方法,提升用户体验。适合对直播应用开发感兴趣的开发者阅读。 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 深度森林算法解析:特征选择与确定能力分析
    本文深入探讨了深度森林算法在特征选择与确定方面的能力。提出了一种名为EncoderForest(简称eForest)的创新方法,作为首个基于决策树的编码器模型,它在处理高维数据时展现出卓越的性能,为特征选择提供了新的视角和工具。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • 如何在 PostgreSQL 中查询表创建语句:PostgreSQL 操作指南
    首先,启动 pgAdmin 并连接到目标数据库服务器。接着,在左侧导航栏中展开“架构”节点,找到并选择需要查询的表。最后,切换到“SQL”标签页,即可查看该表的创建语句。此外,你还可以通过执行 `SELECT pg_get_ddl_command('表名'::regclass);` 命令来直接获取表的 DDL 语句。 ... [详细]
  • 本研究探讨了数字循环结构的分析与应用,通过以1为中心,使用2至n以及n*n的数字构建循环模式。该结构在时间和空间效率上具有显著优势,适用于多种算法和数据处理场景。实验结果显示,该方法在多项测试中表现出色,具有较高的实用价值。 ... [详细]
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 自回归与非自回归模型如何融合?预训练模型BANG提供可能解决方案
    近年来,预训练技术的快速发展显著提升了自然语言生成的性能。然而,自回归模型和非自回归模型在生成质量和效率上各有优劣。微软研究院提出了一种新的预训练模型BANG,通过巧妙地结合两者的优点,提供了一种有效的解决方案。该模型不仅在生成质量上表现出色,还在推理速度上实现了显著提升,为自然语言生成任务带来了新的可能性。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • NVIDIA CUDA Toolkit 不同版本的安装方法详解
    在安装NVIDIA CUDA Toolkit以配置GPU加速环境时,通常可以通过查阅网络文章或访问官方文档来获取安装指南。然而,这些资料往往侧重于介绍最新版本的安装方法,而忽视了不同版本之间的差异。本文将详细解析各个版本的安装步骤,帮助用户根据自身需求选择合适的CUDA Toolkit版本进行安装,确保兼容性和性能最优化。 ... [详细]
  • 在 PyTorch 中,`pin_memory` 技术用于锁定页面内存。当在创建 `DataLoader` 时将 `pin_memory` 参数设置为 `True`,这意味着生成的 Tensor 数据最初会被存储在锁定的内存中。这一技术能够显著提高数据从 CPU 到 GPU 的传输效率,从而加快训练速度。通过合理利用 `pin_memory`,可以有效减少数据加载的瓶颈,提升整体性能。 ... [详细]
author-avatar
萌萌虾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有