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

    文章

    4717

    浏览量

    68196
  • Vulkan
    +关注

    关注

    0

    文章

    28

    浏览量

    5695
  • 光线追踪
    +关注

    关注

    0

    文章

    182

    浏览量

    21456

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

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

收藏 人收藏

    评论

    相关推荐

    基于光线追踪的渲染算法实现

    我们已经涵盖了所有需要说的内容!我们现在准备写我们的第一个光线追踪器。你现在应该能够猜到光线追踪算法是如何工作的了。首先,注意到自然界中光的传播只是从光源发出无数条射线,反弹直到它们撞
    的头像 发表于 10-30 08:06 164次阅读
    基于<b class='flag-5'>光线</b><b class='flag-5'>追踪</b>的渲染算法实现

    光学透过率测量仪的技术原理和应用场景

    光学透过率测量仪(也称为光透过率检测仪)是一种专门用于测量材料透光率的仪器。以下是对其技术原理和应用场景的详细解析:技术原理光学透过率测量仪的技术原理主要基于光的透射原理。当光线通过物质时,会发
    发表于 10-16 14:38

    TLV320AIC3254具有6路的语音录制功能,可否生成6路完全独立的音频文件?

    您好,请问下TLV320AIC3254具有6路的语音录制功能,请问下,可否生成6路完全独立的音频文件?由于每个拾音器是分别放置于不同的位置。谢谢。
    发表于 10-12 08:58

    光线追踪的工作原理

    课程射线跟踪渲染技术概述[2]。在本课程的开始,我们将解释如何将三维场景制成可视的二维图像。一旦我们理解了这个过程及其所涉及的内容,我们可以利用计算机通过类似的方
    的头像 发表于 09-30 08:05 159次阅读
    <b class='flag-5'>光线</b><b class='flag-5'>追踪</b>的工作原理

    生成式人工智能的概念_生成式人工智能主要应用场景

    生成式人工智能(Generative Artificial Intelligence,简称GAI)是一种先进的人工智能技术,其核心在于利用计算机算法和大量数据来生成新的、具有实际价值的内容。这种技术能够模拟人类的创造力和想象力,
    的头像 发表于 09-16 16:05 575次阅读

    AMD光线追踪专家加盟高通,共筑Adreno GPU性能新高度

    在科技行业日新月异的今天,顶尖人才的流动往往预示着技术创新与突破的新篇章。近日,一则令人瞩目的消息在半导体与图形处理领域引起了广泛关注——AMD前光线追踪技术领域的杰出专家Paritosh
    的头像 发表于 07-11 10:03 517次阅读

    解码AI驱动的DLSS 3.5光线重建功能

    神经网络渲染器提高了光线追踪图像质量,使用可在采样光线之间生成更高质量像素的 AI 网络取代需要人工设计的降噪器。
    的头像 发表于 05-11 11:06 472次阅读
    解码AI驱动的DLSS 3.5<b class='flag-5'>光线</b>重建功能

    MediaTek携手望尘科技通过移动端光线追踪技术打造沉浸体育游戏体验

    MediaTek携手望尘科技(GALA Sports),在手游领域实现了光线追踪技术的革命性应用。该技术现已成功融入望尘科技旗下的钓鱼与篮球体育游戏中,极大地提升了玩家的视觉沉浸体验,让游戏画面更加逼真。
    的头像 发表于 05-07 11:39 637次阅读

    MediaTek携手望尘科技共同推进移动端光线追踪技术在手游中的应用落地

    MediaTek 与望尘科技(GALA Sports)携手合作,共同推进移动端光线追踪技术在手游中的应用落地,将该技术成功导入了望尘科技旗下的钓鱼和篮球体育在线类游戏,为玩家带来更具沉浸感的逼真游戏画面。
    的头像 发表于 04-18 10:04 337次阅读
    MediaTek携手望尘科技共同推进移动端<b class='flag-5'>光线</b><b class='flag-5'>追踪</b>技术在手游中的应用落地

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

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

    追踪跳线都用哪些场景

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

    Linux中的软、链接的区别

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

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

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

    追踪器arduino原理

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

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

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