Vmamapmemory Отправка неправильных данных в вершину -шейдерC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Vmamapmemory Отправка неправильных данных в вершину -шейдер

Сообщение Anonymous »

Я работаю над рендерером 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, они оба работают без каких -либо Проблемы на стороне процессора, но та же проблема на графическом процессоре.


Подробнее здесь: https://stackoverflow.com/questions/794 ... tex-shader
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»