Я работаю над рендерером 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++
Программы на C++. Форум разработчиков
1740520016
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 .
[b] Вот интерпретация renderdoc единого буфера < /strong> < /p>
Для справки, это векторные данные на CPU [/b]
[b] и это матричные данные на процессоре [/b]
Вот как я связываю память:
// 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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79466227/vmamapmemory-sending-wrong-data-to-vertex-shader[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия