Я реализовал несколько вершинных буферов для объектов, чтобы каждый BLAS получал свой собственный вершинный буфер. Ранее я пытался использовать один большой буфер вершин со смещениями, как предложено в руководстве nvidia. https://developer.nvidia.com/rtx/raytracing/vkray
К сожалению, это привело к полному сбою моего компьютера после окончания первого прохода рендеринга. Поэтому следующим моим шагом было использование нескольких буферов вершин. Но как только рендерится второй BLAS, на объекте появляются странные случайные шумы. Похоже, шейдер не знает, как его отобразить, хотя вершинный буфер отправляется в шейдер. Я полностью потерян.
Кто-нибудь знает, что здесь происходит?
Пробовал один большой буфер вершин. Пробовал использовать один большой буфер индексов, без разницы.
//Vertexbuffer creation
void HelloVulkan::createVertexBuffer(const std::vector<Vertex>& vertex, int
...
VkCtx.createBuffer(bufferSize,
VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
m_geometryInstances[iGmtrycount].vertexBuffer,
m_geometryInstances[iGmtrycount].vertexBufferMemory);
VkCtx.copyBuffer(stagingBuffer, m_geometryInstances[iGmtrycount].vertexBuffer, bufferSize);
...
}
// Vertex Buffer binding to descriptorset generator (nvidia turoials)
std::vector<VkDescriptorBufferInfo> Vertexbindings = {};
for(int i=0; i < m_geometryInstances.size(); i++)
{
VkDescriptorBufferInfo vertexInfo = {};
vertexInfo.buffer = m_geometryInstances[i].vertexBuffer;
vertexInfo.offset = 0;
vertexInfo.range = VK_WHOLE_SIZE;
Vertexbindings.push_back(vertexInfo);
}
//Actual binding
m_rtDSG.Bind(m_rtDescriptorSet, 3, Vertexbindings);
//SHADER closest hit
//in the bindings:
layout(binding = 3, set = 0) buffer Vertices { vec4 v[]; }
vertices;
//unpack vertex
Vertex unpackVertex(uint index)
{
Vertex v;
vec4 d0 = vertices.v[vertexSize * index + 0];
vec4 d1 = vertices.v[vertexSize * index + 1];
vec4 d2 = vertices.v[vertexSize * index + 2];
v.pos = d0.xyz;
v.nrm = vec3(d0.w, d1.x, d1.y);
v.color = vec3(d1.z, d1.w, d2.x);
v.texCoord = vec2(d2.y, d2.z);
v.matIndex = floatBitsToInt(d2.w);
return v;
}
Видео об ошибке. Похоже, что материал как-то под влиянием окружающей среды:
Imgur