[Vulkan] BufferDeviceAddress를 사용하여 데이터 접근을 쉽게 하기를 원합니다.
GLSL 준비
GLSL 측면에서 다음을 준비합니다.
MeshAddress
을 수신하는 어레이사용
buffer_reference
정점 배열 준비#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
어레이 버퍼 생성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];
이렇게 하면 예쁘게 쓸 수 있다.끝.
Reference
이 문제에 관하여([Vulkan] BufferDeviceAddress를 사용하여 데이터 접근을 쉽게 하기를 원합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/nishiki/articles/14e35f2862d334텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)