0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何生成具有硬阴影的完全光线追踪场景

Dbwd_Imgtec 来源:Imagination Tech 作者:Imagination Tech 2022-04-06 12:59 次阅读
在任何视觉图形的场景中,为了让用户获得更真实的体验,阴影往往发挥着重要作用。不过,它们长期以来一直是实时应用程序中在速度和质量方面最难完成的功能之一。随着硬件的改进和硬件加速光线追踪技术的普及,开发人员获得了比以往任何时候都更准确、更快地渲染阴影的能力。在Imagination,我们相信光线追踪在未来实时渲染中的潜力,并一直在寻求可能的界限突破。这篇博文将简要介绍如何生成具有硬阴影的完全光线追踪场景,以及Khronos Vulkan光线追踪扩展的高级概述。对于那些已经阅读了我们之前《Vulkan中的环境遮挡》的读者来说,这是很好的后续内容,从完全通过光栅化的光照技术到现在使用完整的光线追踪。正如《Vulkan中的环境遮挡》一样,我们的PowerVR SDK中有一个完全光线追踪硬阴影的代码示例,您可以在空闲时间探索。

当前的阴影技术

在过去十年中,实时渲染阴影的流行方法是使用阴影贴图。这是场景从光源视角再次渲染到离屏深度缓冲区(称为阴影贴图)的地方,然后在着色过程中对阴影贴图进行采样,以使用深度比较计算可见性。虽然这种方法已经成功地应用于许多应用中,但它也有一些缺点。

最常见的问题是阴影锯齿——这是在阴影贴图的分辨率过低的地方,导致出现块状阴影。虽然可以通过使用更高分辨率的阴影贴图来解决,但会增加内存占用和带宽利用率,可能会对性能产生负面影响,尤其是在移动设备上。即使使用更高分辨率的阴影贴图,某些微观细节也很难保留,这要后续的屏幕空间阴影通道来细化。但是,在使用光线追踪时,可以在屏幕上为每个像素分配一条光线,这将产生像素完美的硬阴影。

光线追踪管线

光线生成

当在命令缓冲区调用 vkCmdTraceRaysKHR ,将为当前绑定的光线追踪流水线调用用户定义的光线生成着色器。追踪光线的命令允许开发人员为调度的线程设置各种参数。我们的演示是完全光线追踪的,这意味着最好为屏幕上的每个像素分配一个光线生成着色器线程。

每次调用光线生成着色器都必须指定将主光线发射到场景中所需的变量。光线需要有原点(视点)和行进方向。可以通过将逆视图矩阵应用于(0,0,0,1)来计算原点。要计算方向,需要当前像素的屏幕空间位置。可以使用 gl_LaunchIDEXT 从光线生成着色器查询分派坐标。使用此内置扩展,屏幕空间坐标和光线方向可以按如下方式计算:

const vec2 pixelCenter = vec2(gl_LaunchIDEXT.xy) + vec2(0.5);const vec2 inUV = pixelCenter / vec2(gl_LaunchSizeEXT.xy);vec2 screenspace = inUV * 2.0 - 1.0;
vec4 target = mInvProjectionMatrix * vec4(screenspace.xy, 1, 1);vec4 direction = mInvViewMatrix * vec4(normalize(target.xyz), 0);

从这里,我们可以使用 traceRayEXT 函数将主光线发射到场景中。然后,它将遍历加速结构,在该结构中,它将命中或错过场景中的几何体,并调用相应着色器组。执行的着色器组将取决于其命中内容,并将像素颜色存储在有效负载结构中。“未命中”着色器只是将光线的颜色设置为硬编码的清除颜色。

命中组着色器

一旦光线与场景中的对象发生碰撞,就会执行命中着色器。顶点缓冲区、索引缓冲区和材质等模型数据都附着到“命中组”着色器。光线追踪扩展允许我们获取命中对象的实例ID。在本演示中,每个模型都是唯一的,因此实例ID直接对应于模型ID。模型ID可用于查找上述缓冲区。

// Since each object is unique in this scene, instance ID is enough to identify which buffers to look upuint objID = gl_InstanceID;
// indices of the triangle we hitivec3 ind = ivec3(indices[nonuniformEXT(objID)].i[3 * gl_PrimitiveID + 0], //    indices[nonuniformEXT(objID)].i[3 * gl_PrimitiveID + 1], //    indices[nonuniformEXT(objID)].i[3 * gl_PrimitiveID + 2]); //
// Vertices of the hit triangleVertex v0 = vertices[nonuniformEXT(objID)].v[ind.x];Vertex v1 = vertices[nonuniformEXT(objID)].v[ind.y];Vertex v2 = vertices[nonuniformEXT(objID)].v[ind.z];

gl_PrimitiveID可以用来告诉我们使用哪些索引来查找命中的顶点,然后使用重心插值系数在它们之间进行插值,该插值系数来自命中着色器中声明为hitAttributeEXT类型的全局变量。然后,我们使用世界矩阵将插值顶点值转换到世界空间,并旋转法线值。

// Get the interpolation coefficientsconst vec3 barycentrics = vec3(1.0 - attribs.x - attribs.y, attribs.x, attribs.y); // Interpolate the position and normal vector for this rayvec4 modelNormal = vec4(v0.nrm * barycentrics.x + v1.nrm * barycentrics.y + v2.nrm * barycentrics.z, 1.0);vec4 modelPos = vec4(v0.pos * barycentrics.x + v1.pos * barycentrics.y + v2.pos * barycentrics.z, 1.0); // Transform the position and normal vectors from model space to world spacemat4 worldTransform = transforms[nonuniformEXT(objID)];vec3 worldPos = (worldTransform * modelPos).xyz; // Don't translate the normal vector, only rotate and scalemat3 worldRotate = mat3(worldTransform[0].xyz, worldTransform[1].xyz, worldTransform[2].xyz);vec3 worldNormal = worldRotate * modelNormal.xyz;

使用击中点的法线和世界位置,我们可以计算光线相对于场景中静态光源的Phong照明分量。然后,我们使用一个新的命中和未命中组从该点向光源发射另一条光线。我们可以将次光线的最大长度设置为击中点和光源之间的距离。如果光线在这个距离内与加速度结构中的任何物体碰撞,我们可以得出结论,在碰撞点和光源之间有一个物体,因此该点处于阴影中。如果次光线未击中距离集内的任何对象,则会执行“未命中”着色器,我们可以假定该点不在阴影中。

如何生成具有硬阴影的完全光线追踪场景

在这个图中,我们可以看到两个例子。光线从视口(1)发射,第一条光线击中点3,第二条光线发射,在到达光源的途中不会击中任何几何体。视点的第二条光线在点4处照射,但在到达光源的过程中,在点5处再次发生碰撞。因此,我们可以得出结论,点4在阴影中,但点3不在阴影中。

优化

虽然光线追踪阴影提供了比传统方法更高的逼真度,但它们仍然不完全完美。因此,就实时计算而言,光线追踪算法需要更多的硬件,这是一个明显的缺点。除此之外,还可以采取一些不同的优化措施来改进本文概述的技术。

阴影检查

我们可以减少第一组用来检查硬阴影的二次光线的数量;这是通过首先检查已计算的Phong光照分量来完成的。如果由于曲面背向光源,光照分量已为0,则检查硬阴影没有意义,因为该点已处于黑暗中。

这将光线预算从屏幕上像素数的大约1.8倍减少到大约1.5倍。这显然取决于场景和其中的对象,因为它随未命中场景的主光线的比例以及通过或未通过阴影检查的主光线的比例而变化。

混合渲染一般来说,光线追踪核心将比传统的光栅化流水线慢(至少目前是这样)。有几个可能的原因,但主要的原因是光线追踪硬件仍然相对较新,因此与光栅化相比,GPU仍然没有为其投入更多的空间。这意味着可以计算一个标准的G缓冲区,并使用位置附件来定位从哪个位置发射阴影检查光线。G缓冲区在《Vulkan中的环境遮挡》中有介绍,所以如果你还没有看到,一定要看一看。简而言之,G缓冲区可以替代主光线,从而产生更好的任务重叠和更小的光线预算。

结束

虽然完全光线追踪的硬阴影在写这篇博文的时候可能不是最佳解决方案,但它们仍然提供了传统流水线难以模拟的细节和准确性。一如既往,我们强烈建议大家看看PowerVR SDK及其代码示例,以了解我们如何实现这些技术和实现这些算法的确切机制。我们也总是通过支持门户或论坛发送电子邮件。

如果您有兴趣了解更多关于各种图形技术的信息,请查看我们的文档网站,或者在SDK Github中探索我们的其他代码示例。

原文标题:Vulkan完全光线追踪硬阴影

文章出处:【微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66501
  • Vulkan
    +关注

    关注

    0

    文章

    28

    浏览量

    5641
  • 光线追踪
    +关注

    关注

    0

    文章

    174

    浏览量

    21348

原文标题:Vulkan完全光线追踪硬阴影

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    微软:SSD固态硬盘可降低显存占用,提高光线追踪性能

    其专利说明如下:由于光线追踪加速结构常需占用其他数据存储空间(如几何图形和纹理数据),导致系统需大增内存负担,且所需带宽大。本文方法旨在缓解这一问题。
    的头像 发表于 03-25 15:46 83次阅读

    追踪跳线都用哪些场景

    鹰眼追踪跳线是一种用于机房管理的工具,可以查询铜缆和光缆(包括超五类、六类、超六类屏蔽/非屏蔽,单模/多模光纤等)。其应用场景包括但不限于: 机房管理:机房是网络设备的核心区域,鹰眼追踪跳线可用
    的头像 发表于 03-21 10:03 75次阅读

    Exarion芯片公司推出声音追踪计算芯片,与台积电共同生产

    Exarion表示,音效追踪技法相类光合卡GPU使用的光线追踪,通过模拟计算虚拟环境中的音轨及反射,实现逼真音效。此项技术能够分辩来自左右上下的声音,且需进行大规模计算。
    的头像 发表于 03-08 15:29 142次阅读

    Linux中的软、链接的区别

    /inittab /test/inittab.hard   发现链接与真实文件的大小和创建日期完全相同,类似于copy,同步更新。   3:链接与拷贝的区别:   发现拷贝与真实文件的创建日期
    发表于 02-04 16:34

    下一代掌机芯片,深度学习、光线追踪还有与VR/AR联动?

    、英伟达、AMD 和高通等。然而,对于下一代掌机芯片,我们还有什么可以期待的突破呢?   深度学习+光线追踪   要说卖得最好的掌机芯片,那无疑是任天堂Switch掌机所搭载的英伟达Tegra X1 SoC,凭借全球 1.3 亿台的出货量,Tegra X1可以说为英伟达
    的头像 发表于 01-09 00:04 1027次阅读

    计算机快速全息生成技术研究

    快速全息生成技术依赖于计算机生成的全息影像 (CGH) 的快速创建。目前,基于光线追踪的计算机生成全息图的快速
    的头像 发表于 12-12 11:15 212次阅读
    计算机快速全息<b class='flag-5'>生成</b>技术研究

    追踪器arduino原理

    追踪器 (LDR) 是一种基于光敏电阻的光测量器件,常用于测量光强度和控制感应器。在 Arduino 上使用 LDR,可以实现对光线进行检测、测量和控制的功能。本文将详细介绍 LDR
    的头像 发表于 12-08 10:22 509次阅读

    首款背接触微米光伏电池问世,阴影效应降低95%

    阴影效应是指太阳能电池若有遮挡物挡住部分光线,就会产生阴影阴影部分产生的电流会比正常光照下的电流要小很多,会降低太阳能电池的发电效率,所以栅线自身的高度、宽度、数量等一系列因素都会决
    的头像 发表于 12-06 16:27 285次阅读

    模拟光线的折射与全反射小程序

    使用LabVIEW模拟光线的折射与全反射
    发表于 11-16 15:56

    TPT自动生成测试用例

    从测试数据中分离激励是完全自动化测试数据生成的推动者。通过对期望的全面描述,您可以创建任何场景(通过测试数据)并及时检测问题。 TPT插件TASMO是迄今为止最受TPT用户喜爱的测试数据生成
    的头像 发表于 11-06 17:30 491次阅读
    TPT自动<b class='flag-5'>生成</b>测试用例

    光线追踪:计算机模拟自然光的奥秘

    在计算机图形学领域,有一种技术能够模拟光线在三维场景中的物理行为,从而生成高度逼真的图像,这就是光线追踪
    的头像 发表于 10-10 10:08 542次阅读
    <b class='flag-5'>光线</b><b class='flag-5'>追踪</b>:计算机模拟自然光的奥秘

    光伏电池在阴影影响下功率特性研究

    光伏电池在阴影影响下照明不均匀,输出特性受到影响。鉴于此,研究了光伏电池的数学特性,分析了光伏电池各区域在无阴影和不同程度阴影影响下的输出特性,最后通过建模仿真实验,总结论证了光伏电池在阴影
    的头像 发表于 09-04 14:05 495次阅读
    光伏电池在<b class='flag-5'>阴影</b>影响下功率特性研究

    NVIDIA 发布全新 DLSS 3.5,为游戏和应用开启 AI 加速的实时光线追踪体验

    。在 NVIDIA 带来的一系列新技术中,作为主打的是 NVIDIA 突破性 AI 神经网络渲染技术的最新成果: DLSS 3.5 。 DLSS 3.5 是 NVIDIA 在 AI 驱动图形领域锐意创新的最新成果,它将为今秋发售的多款热门光线追踪游戏实现进一步的画
    的头像 发表于 08-29 17:50 427次阅读

    SIGGRAPH 2023 | 通过 NVIDIA OptiX 8 实现灵活且强大的光线追踪功能

    实现逼真的视觉效果一直是计算机图形领域人士所追求的目标。 NVIDIA OptiX 是一款强大且灵活的光线追踪技术框架,能让用户充分挖掘光线追踪的潜力。NVIDIA OptiX 是一款
    的头像 发表于 08-14 17:25 333次阅读
    SIGGRAPH 2023 | 通过 NVIDIA OptiX 8 实现灵活且强大的<b class='flag-5'>光线</b><b class='flag-5'>追踪</b>功能

    SIGGRAPH 2023 | 由 RTX 赋能的空间框架通过 USD 实现全光线追踪 XR 流程

    新的可执行程序的速度。 NVIDIA Omniverse 中的全新空间框架通过通用场景描述(即 OpenUSD)和由 NVIDIA RTX 驱动的光线追踪技术帮助解决了这些难题。全球首个全光线
    的头像 发表于 08-11 20:10 206次阅读