Я работаю над рендерером Vulkan, и я хочу создать для него систему отражения шейдера, чтобы я мог легко получить и установить униформу моего шейдера (я предполагаю, что только один унифицированный буфер будет существовать в Шейдер на данный момент).
Я использую VMA для распределения равномерных буферов и отображения его с помощью VmamapMemory < /code>, а затем обновлять части буфера с помощью пользовательской функции SetProperty. Мой равномерный блок в GLSL определяется как: < /p>
#version 450
layout(set = 0, binding = 0) uniform ViewUniforms {
mat4 viewproj;
vec3 pos;
} view;
< /code>
Согласно правилам макета STD140, я ожидаю, что ViewProj будет занимать смещение 0 (64 байта) и POS для начала в смещении 64 (с 16 байтами, выделенными для VEC3). Мой код отражения подтверждает, что эти смещения верны, однако, когда я запускаю приложение в RenderDoc, я замечаю, что GPU в конечном итоге читает первый элемент матрицы (0,8033) в качестве компонента x pos .
Вот интерпретация renderdoc единого буфера < /strong> < /p>
Для справки, это векторные данные на CPU
и это матричные данные на процессоре
Вот как я связываю память:
// Allocate uniform buffer with VMA
VulkanAllocatedBuffer buffer(
static_cast(this->m_uniformBufferData.size()),
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
VMA_MEMORY_USAGE_CPU_TO_GPU,
rendererImpl->GetVmaAllocator()
);
// Map the memory
vmaMapMemory(rendererImpl->GetVmaAllocator(),
buffer.GetAllocation(),
&this->m_uniformBufferMappedData);
// Update descriptor set with buffer (omitted for brevity)
< /code>
my Property Setter < /p>
template
inline void SetProperty(const std::string_view& name, T value) {
// Retrieve binding info (offset, size) from reflection data
const ShaderBindings& binding = this->FindBinding(name);
HUSH_ASSERT(this->m_uniformBufferMappedData != nullptr, "Material buffer is not initialized!");
// Write data to mapped memory at the binding’s offset
std::byte* dataStartingPoint = static_cast(this->m_uniformBufferMappedData) + binding.offset;
memcpy(dataStartingPoint, &value, sizeof(T));
}
< /code>
И, наконец, вот как я их использую < /p>
ShaderMaterial* shaderMat = this->m_gridEffect.GetMaterial();
glm::mat4 viewproj = proj * view; // Properly computed view-projection matrix
glm::vec3 position = this->m_editorCamera.GetPosition();
shaderMat->SetProperty("viewproj", viewproj);
shaderMat->SetProperty("pos", position);
< /code>
Я попытался убедиться, что указатель Uniformbuffer фактически содержит данные, преобразуя необработанную память обратно в GLM :: Vec3 и Glm :: Mat4, они оба работают без каких -либо Проблемы на стороне процессора, но та же проблема в GPU. < /p>
Подробнее:
m_uniformBufferMappedData не является нулевым после вызова Vmamapmemory , слои проверки Vulkan, кажется, не запускаются, и выполнение GetProperty ("pos") и getProperty ("viewProj") действительно дает Я вернусь в правильную позицию и просмотр проекции, которую я ожидаю.
Ожидаемая проекция представления - < /p>
0.803333 0.000000 0.000000 0.000000
0.000000 -1.428148 0.000000 0.000000
0.000000 0.000000 0.000010 -1.000000
0.000000 0.000000 0.099951 5.000000
< /code>
А ожидаемая позиция: < /p>
(0, 0, 5)
Подробнее здесь: https://stackoverflow.com/questions/794 ... tex-shader
Vmamapmemory Отправка неправильных данных в вершину шейдера [закрыто] ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение