如您所知,顶点缓冲区可以包含除位置之外的其他属性,如纹理坐标或切线。(至少在土地化方面)
DXR通过BLAS获取这个顶点缓冲区,将其上传到GPU,并执行射线跟踪。但是它如何区分哪个属性是顶点位置呢?
还是我误会了什么?
我的代码就是这样。顶点结构有位置、坐标、切线和biTangent。
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对象的每个顶点属性?在一个描述符堆里?
发布于 2022-08-15 11:13:35
我搜索了DXR规范,并找到了GeometryIndex、InstanceID和InstanceIndex系统值。
它们返回当前的BLAS或TLAS索引,它们是用户生成的对象,对吗?
我应该做的很简单。如果我想得到每个BLAS几何的纹理索引,然后上传StructuredBuffer索引,和BLAS一样。
我可以在最近的点击(或任何点击)着色器中获得GeometryIndex,所以我可以得到如下的材料索引:
StructuredBuffer<TextureIndex> gTextureIndices;
TextureIndex currentIndex = gTextureIndices[GeometryIndex];如果您想要相同的BLAS,但作为一种不同的材料,那么您可以使用InstanceIndex而不是GeometryIndex。( StructuredBuffer必须被编入索引,与TLAS一样,这一点是肯定的。)
更新
实际上,有一种更简单的方法可以做到这一点。
为常量缓冲区创建资源,根据需要初始化它,并将其放入着色表的命中程序中。
它只是作为一般根常量(对于每个实例)工作。
参见NVIDIA示例的PerInstanceConstantBuffer教程。
https://stackoverflow.com/questions/73331350
复制相似问题