Я начал играть с металлическим api и включил его в свой рендерер как новый api. Однако у меня возникают проблемы с данными в моем MTLBuffer
после создания и инициализации.
У меня есть некоторый api-независимый класс для буферов и потоков вершин, который я использую вот так:
// Fill vertex streams with data
auto& positionStream = vb.GetDataStream<0>().AddData(
// Quad 1
Vec4{ -0.5f, -0.5f, -0.5f, 1.0f },
Vec4{ x.xf, -0.5f, -0.5f, 1.0f },
Vec4{ 0.5f, -0.5f, 0.5f, 1.0f },
Vec4{ -0.5f, -0.5f, 0.5f, 1.0f },
// Quad 2
Vec4{ -0.5f, 0.5f, -0.5f, 1.0f },
Vec4{ 0.5f, 0.5f, -0.5f, 1.0f },
Vec4{ 0.5f, 0.5f, 0.5f, 1.0f },
Vec4{ -0.5f, 0.5f, 0.5f, 1.0f }
);
Где Vec4 действительно более простая структура:
struct Vec4
{
float x{ 0.0f };
float y{ 0.0f };
float z{ 0.0f };
float w{ 0.0f };
};
Каждый поток данных буфера вершин поддерживается MTLBuffer. Однако, когда я создаю и инициализирую этот поток данными, элемент x
, который я пометил в образце кода как x.x
, содержит какое-то значение мусора. Если я устанавливаю это значение на что-нибудь, это всегда мусор. Я использую некоторые другие потоки для индексов, цветов, текскордов, и все эти данные верны. Создаю буферы с обращением к
[device newBufferWithBytes:data length:length options:0]
Вот что я вижу, когда снимаю кадр:
Редактировать: Я также заметил, что это происходит при моем первом создании MTLBuffer, я пытался сначала создать MTLBuffer для данных цвета, а затем для позиций и цвета были повреждены, а позиции отлично.
Есть идеи, что может вызвать это?
length
в вашемnewBufferWithBytes:...
звонке? Помогает ли делать[buffer didModifyRange:NSMakeRange(0, length)]
после создания? (Не обязательно, но мало ли.) - person Ken Thomases   schedule 11.07.2019didModifyRange
, поскольку это допустимо только для частных буферов - person mezo   schedule 11.07.2019