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

    文章

    4942

    浏览量

    73165
  • Vulkan
    +关注

    关注

    0

    文章

    30

    浏览量

    6089
  • 光线追踪
    +关注

    关注

    0

    文章

    185

    浏览量

    22050

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DLInfer联手沐曦股份实现数据生成场景的实际落地

    近期,上海 AI 实验室 DeepLink 团队推出的 DLInfer 通过支持 LMDeploy 主流模型推理,助力沐曦股份曦云 C500 落地 MinerU 多模态数据生成场景,Graph 模式下实现性能加速 60%。
    的头像 发表于 12-09 14:55 310次阅读
    DLInfer联手沐曦股份实现数据<b class='flag-5'>生成</b><b class='flag-5'>场景</b>的实际落地

    如何选择适合的智驾仿真工具进行场景生成和测试?

    在自动驾驶技术日益发展的背景下,选择合适的智驾仿真工具进行场景生成和测试显得尤为重要。该工具不仅需要支持高精度的场景重建,还需满足多种环境条件和传感器模型的兼容性。本文将深入探讨如何评估不同智驾仿真
    的头像 发表于 11-25 10:32 161次阅读
    如何选择适合的智驾仿真工具进行<b class='flag-5'>场景</b><b class='flag-5'>生成</b>和测试?

    桂花网M1000:轻量型蓝牙网关的场景落地与客户实践

    :移动资产的动态追踪 M1000 的 4G 广域覆盖与轻量化设计,成为车载、物流等移动场景的 “连接中枢”。 1. 冷链运输环境监控 某冷链物流企业为冷藏车部署 M1000,搭配蓝牙温湿度传感器,实现
    发表于 11-12 16:59

    物联网RFID物流追踪技术是什么?其技术原理和应用场景

    本文深入探讨RFID在物流追踪中的技术原理、应用场景、行业数据与落地策略,面向供应链与技术负责人,帮助你理解并推进从仓储、运输到最后一公里的 RFID 项目。
    的头像 发表于 11-11 10:58 296次阅读
    物联网RFID物流<b class='flag-5'>追踪</b>技术是什么?其技术原理和应用<b class='flag-5'>场景</b>

    拼多多商品推广链接生成API:社交裂变的转化追踪利器

    ​ 在社交电商时代,拼多多通过 商品推广链接生成API 为商家提供了精准的流量转化解决方案。该工具不仅简化了社交裂变活动的落地,更实现了全链路转化效果追踪,成为提升营销效率的核心引擎。 一、核心
    的头像 发表于 09-08 16:22 503次阅读
    拼多多商品推广链接<b class='flag-5'>生成</b>API:社交裂变的转化<b class='flag-5'>追踪</b>利器

    告别数月等待:数字孪生场景生成从此进入“日级”时代

    告别数月等待:数字孪生场景生成从此进入“日级”时代
    的头像 发表于 09-05 17:33 2284次阅读
    告别数月等待:数字孪生<b class='flag-5'>场景</b><b class='flag-5'>生成</b>从此进入“日级”时代

    CoolSiC™ MOSFET G2如何正确选型 开关与软开关场景解析

    在功率电子领域,英飞凌的CoolSiCMOSFETG2以其卓越性能备受关注。本文将重点分析如何在开关和软开关两种应用场景下,正确选型CoolSiCMOSFETG2,以实现最佳系统性能。
    的头像 发表于 08-26 09:04 5278次阅读
    CoolSiC™ MOSFET G2如何正确选型 <b class='flag-5'>硬</b>开关与软开关<b class='flag-5'>场景</b>解析

    生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践

    生成式AI驱动的4D场景技术正解决传统方法效率低、覆盖不足等痛点,如何通过NeRF、3D高斯泼溅等技术实现高保真动态建模?高效生成极端天气等长尾场景?本文为您系统梳理AI驱动的4D
    的头像 发表于 08-06 11:20 4825次阅读
    <b class='flag-5'>生成</b>式 AI 重塑自动驾驶仿真:4D <b class='flag-5'>场景</b><b class='flag-5'>生成</b>技术的突破与实践

    光线跳线怎么用

    光线跳线(光纤跳线)是用于连接光纤设备(如交换机、路由器、光模块、光纤收发器等)或实现光信号灵活分配的关键组件,其使用方法需结合具体场景和设备类型。以下是详细的使用指南: 一、光线跳线的基本组
    的头像 发表于 07-18 09:40 589次阅读

    超125款游戏和应用支持DLSS 4多帧生成

    在 COMPUTEX 2025,NVIDIA 发布多项内容。现在已有超过 125 款游戏和应用支持 DLSS 4 多帧生成,并有 10 款新游戏即将发布,《毁灭战士:黑暗时代》将于 6 月更新支持路径追踪与 DLSS 光线重建,
    的头像 发表于 05-22 10:10 1276次阅读

    光线追踪及降噪技术综述

    过程传递3D场景的结果。渲染主要包括光栅化(rasterization)[5]和光线追踪[6]两种方式。光栅化渲染采用局部光照原理,根据光源照射到物体上直接可见的
    的头像 发表于 04-01 11:31 810次阅读
    <b class='flag-5'>光线</b><b class='flag-5'>追踪</b>及降噪技术综述

    一种多模态驾驶场景生成框架UMGen介绍

    端到端自动驾驶技术的快速发展对闭环仿真器提出了迫切需求,而生成式模型为其提供了一种有效的技术架构。然而,现有的驾驶场景生成方法大多侧重于图像模态,忽略了其他关键模态的建模,如地图信息、智能交通参与者等,从而限制了其在真实驾驶
    的头像 发表于 03-24 15:57 1517次阅读
    一种多模态驾驶<b class='flag-5'>场景</b><b class='flag-5'>生成</b>框架UMGen介绍

    敏捷合成器的技术原理和应用场景

    ,在多个领域具有广泛的应用场景: 通信测试:在通信设备的研发和生产过程中,敏捷合成器可用于生成各种调制信号和测试信号,以验证设备的性能和稳定性。 雷达系统:雷达系统需要高精度和高稳定性的信号源来
    发表于 02-20 15:25

    自动驾驶测试场景库的构建及评价方法之场景生成方法研究

      自动驾驶测试场景库的构建及评价方法(二) 场景生成方法研究 一、研究背景   智能网联汽车面临多维度安全挑战,其中预期功能安全是重要组成部分。在当前阶段,智能网联汽车产业正处于前所未有的高速
    的头像 发表于 01-22 10:51 2150次阅读
    自动驾驶测试<b class='flag-5'>场景</b>库的构建及评价方法之<b class='flag-5'>场景</b><b class='flag-5'>生成</b>方法研究

    华为支付-(可选)特定场景配置操作

    签约代扣场景 涉及商户:直连商户、服务商、平台类商户 处理人:商户产品、商户BD等 场景二:涉及账单下载 如需要生成及下载账单,需商户在华为支付商户平台入网时设置的管理员先在“华为支付商户平台
    发表于 01-21 10:30