BufferView 中的字节偏移量大于字节长度
Byte offset greater than Byte Length in BufferView
我正在尝试使用 Microsoft::glTF SDK 从 scene.bin 个文件中读取数据。 TinyGLTF 不是一个选项。当我尝试读取名为 TEXCOORD_0 的 MeshPrimitive 属性时,出现 BufferView byteOffset 大于 byteLength 的情况。因此,我不知道如何正确读取给定数据并且我的程序崩溃了。
我尝试使用 IStreamReader 读取数据,它是 SDK 的一部分,并且在使用此 SDK 读取 bin 文件时是必须的。我通过添加 accessor.byteOffset + bufferView.byteOffset 来计算数据偏移量,即 > byteLength.
struct BuffersAccessors {
Microsoft::glTF::Accessor accessor;
Microsoft::glTF::BufferView view;
Microsoft::glTF::Buffer buffer;
void operator=(BuffersAccessors accessors);
};
template<typename T> struct BufferInfo {
BuffersAccessors buffersAccessors;
std::vector<T> bufferData;
BufferInfo<T>();
BufferInfo<T>(BuffersAccessors buffersAccessors, std::vector<T> bufferData);
const void operator=(const BufferInfo<T> &info) {
buffersAccessors = info.buffersAccessors;
bufferData = info.bufferData;
};
};
template<typename T>
std::vector<T> readBufferData(Microsoft::glTF::Document document, BufferInfo<T> bufferInfo, std::filesystem::path path) {
std::vector<T> stream;
if (bufferInfo.buffersAccessors.buffer.uri.length() > 0 || bufferInfo.buffersAccessors.buffer.byteLength > 0) {
Microsoft::glTF::Buffer buffer = bufferInfo.buffersAccessors.buffer;
path += bufferInfo.buffersAccessors.buffer.uri;
path = std::filesystem::absolute(path);
buffer.uri = path.string();
std::shared_ptr<StreamReader> streamReader = std::make_shared<StreamReader>(path);
Microsoft::glTF::GLTFResourceReader reader(streamReader);
stream = reader.ReadBinaryData<T>(buffer, bufferInfo.buffersAccessors.view);
}
return stream;
}
template<typename T>
BufferInfo<T> getFullBufferData(Microsoft::glTF::Document document, std::string accessorKey, std::filesystem::path path) {
BufferInfo<T> bufferInfo{};
BuffersAccessors mainPart = getBufferAccessorFromDocument(document, accessorKey);
bufferInfo.buffersAccessors = mainPart;
std::vector<T> bufferData = vkglTF::readBufferData<T>(document, bufferInfo, path);
const size_t bufferDataOffset = mainPart.accessor.byteOffset + mainPart.view.byteOffset; //How to properly calculate offset?
bufferData.erase(bufferData.begin(), bufferData.begin() + bufferDataOffset);
bufferInfo.bufferData = bufferData;
return bufferInfo;
}
我希望数据采用 uint8 和 uint16 等格式,但我的程序在尝试执行 bufferData.erase(..).
时崩溃
编辑:阅读 WEIGHTS_0 时也会发生这种情况。
我认为您的代码最有可能的错误是字节偏移量和向量元素索引的混合。您是否尝试过将 bufferDataOffset
除以 sizeof(T)
?
其次,如果您只想读取访问器的数据,请尝试使用接受访问器参数的 ReadBinaryData 重载。这样 glTF SDK 将为您处理所有偏移量计算。
没有文档,但 deserialize 示例演示了使用 glTF SDK 时推荐的基本代码结构。
我正在尝试使用 Microsoft::glTF SDK 从 scene.bin 个文件中读取数据。 TinyGLTF 不是一个选项。当我尝试读取名为 TEXCOORD_0 的 MeshPrimitive 属性时,出现 BufferView byteOffset 大于 byteLength 的情况。因此,我不知道如何正确读取给定数据并且我的程序崩溃了。
我尝试使用 IStreamReader 读取数据,它是 SDK 的一部分,并且在使用此 SDK 读取 bin 文件时是必须的。我通过添加 accessor.byteOffset + bufferView.byteOffset 来计算数据偏移量,即 > byteLength.
struct BuffersAccessors {
Microsoft::glTF::Accessor accessor;
Microsoft::glTF::BufferView view;
Microsoft::glTF::Buffer buffer;
void operator=(BuffersAccessors accessors);
};
template<typename T> struct BufferInfo {
BuffersAccessors buffersAccessors;
std::vector<T> bufferData;
BufferInfo<T>();
BufferInfo<T>(BuffersAccessors buffersAccessors, std::vector<T> bufferData);
const void operator=(const BufferInfo<T> &info) {
buffersAccessors = info.buffersAccessors;
bufferData = info.bufferData;
};
};
template<typename T>
std::vector<T> readBufferData(Microsoft::glTF::Document document, BufferInfo<T> bufferInfo, std::filesystem::path path) {
std::vector<T> stream;
if (bufferInfo.buffersAccessors.buffer.uri.length() > 0 || bufferInfo.buffersAccessors.buffer.byteLength > 0) {
Microsoft::glTF::Buffer buffer = bufferInfo.buffersAccessors.buffer;
path += bufferInfo.buffersAccessors.buffer.uri;
path = std::filesystem::absolute(path);
buffer.uri = path.string();
std::shared_ptr<StreamReader> streamReader = std::make_shared<StreamReader>(path);
Microsoft::glTF::GLTFResourceReader reader(streamReader);
stream = reader.ReadBinaryData<T>(buffer, bufferInfo.buffersAccessors.view);
}
return stream;
}
template<typename T>
BufferInfo<T> getFullBufferData(Microsoft::glTF::Document document, std::string accessorKey, std::filesystem::path path) {
BufferInfo<T> bufferInfo{};
BuffersAccessors mainPart = getBufferAccessorFromDocument(document, accessorKey);
bufferInfo.buffersAccessors = mainPart;
std::vector<T> bufferData = vkglTF::readBufferData<T>(document, bufferInfo, path);
const size_t bufferDataOffset = mainPart.accessor.byteOffset + mainPart.view.byteOffset; //How to properly calculate offset?
bufferData.erase(bufferData.begin(), bufferData.begin() + bufferDataOffset);
bufferInfo.bufferData = bufferData;
return bufferInfo;
}
我希望数据采用 uint8 和 uint16 等格式,但我的程序在尝试执行 bufferData.erase(..).
时崩溃编辑:阅读 WEIGHTS_0 时也会发生这种情况。
我认为您的代码最有可能的错误是字节偏移量和向量元素索引的混合。您是否尝试过将 bufferDataOffset
除以 sizeof(T)
?
其次,如果您只想读取访问器的数据,请尝试使用接受访问器参数的 ReadBinaryData 重载。这样 glTF SDK 将为您处理所有偏移量计算。
没有文档,但 deserialize 示例演示了使用 glTF SDK 时推荐的基本代码结构。