【问题标题】:What are the normal methods for achiving texture mapping with raytracing?使用光线追踪实现纹理映射的常规方法是什么?
【发布时间】:2021-05-13 17:36:33
【问题描述】:

当您创建 BLAS(底层加速结构)时,您可以指定任意数量的顶点/索引缓冲区作为结构的一部分。最终如何与着色器交互并在描述符集中指定?我应该如何将这些结构与材料联系起来?

纹理映射通常如何通过光线跟踪完成?我在Q2RTX 中看到了某种“材料表”,但文档不存在,代码注释很少。

【问题讨论】:

    标签: vulkan raytracing


    【解决方案1】:

    一种常见的方法是将材质缓冲区与纹理数组结合使用,该数组在您需要纹理数据的着色器中寻址。然后,您传递材料 ID,例如per-vertex 或 per-primitive 然后使用它来动态获取材质,以及纹理索引。由于 Vulkan 光线追踪的要求,您可以通过使用 VK_EXT_descriptor_indexing 扩展 (Spec) 来简化此操作,从而可以创建包含渲染场景所需的所有纹理的大型描述符集。

    相关着色器部分:

    // Enable required extension
    ...
    #extension GL_EXT_nonuniform_qualifier : enable
    
    // Material definition
    struct Material {
        int albedoTextureIndex;
        int normalTextureIndex;
        ...
    };
    
    // Bindings
    layout(binding = 6, set = 0) readonly buffer Materials { Material materials[]; };
    layout(binding = 7, set = 0) uniform sampler2D[] textures;
    
    ...
    // Usage
    void main()
    {
        Primitive primitive = unpackTriangle(gl_Primitive, ...);
        Material material = materials[primitive.materialId];
        vec4 color = texture(textures[nonuniformEXT(material.albedoTextureIndex)], uv);
        ...
    }
    
    

    然后在您的应用程序中创建一个缓冲区来存储在主机上生成的材质,并将其绑定到着色器的绑定点。

    对于纹理,您将它们作为纹理数组传递。阵列纹理也是一种选择,但由于每个阵列切片的大小相同,因此不够灵活。请注意,在上面的示例中它没有大小限制,这是由VK_EXT_descriptor_indexing 实现的,并且只允许用于描述符集中的最终绑定。这为您的设置增加了一些灵活性。

    至于传递您从中获取数据的材质索引:最简单的方法是将该信息与您的顶点数据一起传递,无论如何您都必须在着色器中访问/解压缩:

        struct Vertex {
            vec4 pos;
            vec4 normal;
            vec2 uv;
            vec4 color;
            int32_t materialIndex;
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2014-11-23
    相关资源
    最近更新 更多