[Vulkan] BufferDeviceAddress를 사용하여 데이터 접근을 쉽게 하기를 원합니다.

9714 단어 C++glslVulkantech
Buffer Device Address를 사용하여 Chit Shader에서 정점 데이터에 액세스합니다.

GLSL 준비


GLSL 측면에서 다음을 준비합니다.
  • 필요한 확장 기능 활성화
  • 필수 주소가 있는 패브릭MeshAddress을 수신하는 어레이

  • 사용buffer_reference 정점 배열 준비
  • sample.rchit
    #version 460
    #extension GL_EXT_ray_tracing : enable
    #extension GL_EXT_scalar_block_layout : enable
    #extension GL_EXT_shader_explicit_arithmetic_types_int64 : require
    #extension GL_EXT_buffer_reference2 : require
    
    struct MeshAddress
    {
        uint64_t vertices;
        uint64_t indices;
    };
    
    struct Vertex
    {
        vec3 pos;
    };
    
    layout(buffer_reference, scalar) buffer Vertices { Vertex v[]; };
    layout(buffer_reference, scalar) buffer Indices { uvec3 i[]; };
    layout(binding = 3) buffer Addresses { MeshAddress address[]; } addresses;
    

    볼칸 준비.


    볼칸 측은 다음과 같은 준비를 하고 있다.
  • 필요한 확장 기능 활성화

  • 포함 vk::DeviceAddress 패브릭 생성 BufferAddress
  • 참조할 버퍼 주소 입력
  • BufferAddress 어레이 버퍼 생성
  • main.cpp
    vk::PhysicalDeviceFeatures deviceFeatures;
    deviceFeatures.shaderInt64 = true;
    
    vk::PhysicalDeviceBufferDeviceAddressFeatures addressFeatures;
    addressFeatures.bufferDeviceAddress = true;
    
    struct BufferAddress
    {
        vk::DeviceAddress vertices;
        vk::DeviceAddress indices;
    };
    
    std::vector<BufferAddress> addresses;
    for(auto&& mesh: meshes){
      BufferAddress address;
      address.vertices = mesh.vertexBuffer.deviceAddress;
      address.indices = mesh.indexBuffer.deviceAddress;
      addresses.push_back(address);
    }
    
    Buffer addressBuffer{
      sizeof(BufferAddress) * addresses.size(), 
      vk::BufferUsageFlagBits::eStorageBuffer |
      vk::BufferUsageFlagBits::eShaderDeviceAddress };
    
    descSet.update("Addresses", addressBuffer);
    

    GLSL에서 사용


    sample.rchit
    MeshAddress address = addresses.address[gl_InstanceID];
    Vertices vertices = Vertices(address.vertices);
    Indices indices = Indices(address.indices);
    
    uvec3 index = indices.i[gl_PrimitiveID];
    Vertex v0 = vertices.v[index.x];
    Vertex v1 = vertices.v[index.y];
    Vertex v2 = vertices.v[index.z];
    
    이렇게 하면 예쁘게 쓸 수 있다.
    끝.

    좋은 웹페이지 즐겨찾기