首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编辑) DXR -我怎样才能上传资料或顶点缓冲索引的Bindless资源?

编辑) DXR -我怎样才能上传资料或顶点缓冲索引的Bindless资源?
EN

Stack Overflow用户
提问于 2022-08-12 08:31:10
回答 1查看 127关注 0票数 0

如您所知,顶点缓冲区可以包含除位置之外的其他属性,如纹理坐标或切线。(至少在土地化方面)

DXR通过BLAS获取这个顶点缓冲区,将其上传到GPU,并执行射线跟踪。但是它如何区分哪个属性是顶点位置呢?

还是我误会了什么?

我的代码就是这样。顶点结构有位置、坐标、切线和biTangent。

代码语言:javascript
复制
std::vector<D3D12_RAYTRACING_GEOMETRY_DESC> geomDescs;
geomDescs.reserve(mMeshMap.size());

for (auto i = meshes.begin(); i != meshes.end(); ++i)
{
    D3D12_RAYTRACING_GEOMETRY_DESC geomDesc = {};
    geomDesc.Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
    geomDesc.Triangles.VertexBuffer.StartAddress = (*i)->GetVertexBufferAlloc()->GetResource()->GetGPUVirtualAddress();
    geomDesc.Triangles.VertexBuffer.StrideInBytes = sizeof(Vertex);
    geomDesc.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
    geomDesc.Triangles.VertexCount = (*i)->GetVertexCount();

    if ((*i)->GetIndexCount() > 0)
    {
        geomDesc.Triangles.IndexBuffer = (*i)->GetIndexBufferAlloc()->GetResource()->GetGPUVirtualAddress();
        geomDesc.Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
        geomDesc.Triangles.IndexCount = (*i)->GetIndexCount();
    }
    geomDesc.Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE;

    geomDescs.push_back(geomDesc);
}

编辑:好的,我发现我需要'Bindless Resources',但是我无法找到正确的方法。

首先,如何才能为访问描述符堆找到正确的“索引”,以获得冲突的三角形属性?

为此,我必须为每个BLAS需要一些常量的缓冲区,但是我如何上传它并在着色器中识别?

第二,是否需要将每个顶点属性上传到GPU,用于Bindless Resources?比如,每个BLAS对象的每个顶点属性?在一个描述符堆里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-15 11:13:35

我搜索了DXR规范,并找到了GeometryIndexInstanceIDInstanceIndex系统值。

它们返回当前的BLAS或TLAS索引,它们是用户生成的对象,对吗?

我应该做的很简单。如果我想得到每个BLAS几何的纹理索引,然后上传StructuredBuffer索引,和BLAS一样。

我可以在最近的点击(或任何点击)着色器中获得GeometryIndex,所以我可以得到如下的材料索引:

代码语言:javascript
复制
StructuredBuffer<TextureIndex> gTextureIndices;

TextureIndex currentIndex = gTextureIndices[GeometryIndex];

如果您想要相同的BLAS,但作为一种不同的材料,那么您可以使用InstanceIndex而不是GeometryIndex。( StructuredBuffer必须被编入索引,与TLAS一样,这一点是肯定的。)

更新

实际上,有一种更简单的方法可以做到这一点。

为常量缓冲区创建资源,根据需要初始化它,并将其放入着色表的命中程序中。

它只是作为一般根常量(对于每个实例)工作。

参见NVIDIA示例的PerInstanceConstantBuffer教程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73331350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档