hlsl - DXR:如何在最近的命中着色器中识别底层 AS 的几何实例
问题描述
我在单个 DXR 底层加速结构 (BLAS) 中有多个几何图形 (D3D12_RAYTRACING_GEOMETRY_DESC)。如何确定其中哪些是在最近的命中着色器内命中的?以下 HLSL 内在函数做一些不同的事情:
- PrimitiveIndex() 返回当前几何体的三角形索引,但它会为 BLAS 内的每个新几何体重新启动,所以我不知道哪个被击中。
- InstanceIndex() 返回顶层的索引而不是底层的索引
- InstanceID() 再次,只为顶层定义
解决方案
我也想知道这一点。不幸的是,我不能给你一个明确的答案,但在这个页面上我发现了以下声明:
由于命中组需要有关被命中几何体的信息——它的顶点数据和材料属性——你通常需要一个本地根表。为了避免通过本地根表传递数据,您还可以使用顶级实例描述符中的实例 id 字段并利用在命中组着色器中隐式可用的实例索引。但请记住,当底层结构包含多个几何图形时,这些值在实例中的所有几何图形之间共享。要为每个几何图形提供唯一数据,必须使用本地根表。
因此,如果我理解正确,您要么必须使用本地根表,要么必须将自己限制为每个底层结构只有一个几何图形。
TraceRay 中有一个 MultiplierForGeometryContributionToShaderIndex 参数,您可以将其设置为 1 以获得每个几何体的不同命中组。如果您存储每个命中组的材料列表,则每个几何体可能只需要一个命中组。
推荐阅读
- r - 错误:包“ENMTools”的延迟加载失败
- javascript - 如何聚焦一个html数组?
- python - 当与 cx_freeze 打包时,Pyshark 会生成命令行窗口。我怎样才能防止这种情况?
- java - 使用超类型创建 MapFunction 时编译失败
- android - 在 Android/iOS 中创建引擎时,如何将参数传递给 Flutter/Dart 主函数?
- python - 两个 Pyspark Dataframe 之间的字符串比较,但存在多对多关系
- node.js - 猫鼬 MongoError : 11000
- android - 使用缩略图页面时的 WebView 问题
- spring-boot - 使用 springboot JPA 进行 AQ 消息传递
- asp.net-core - 简化 .net core web api 设计复杂度