【问题标题】:MTLBuffer corrupted dataMTLBuffer 损坏的数据
【发布时间】:2019-11-21 04:49:41
【问题描述】:

我已经开始使用 metal 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 元素包含一些垃圾值。如果我将此值设置为任何值,它总是垃圾。我将其他一些流用于索引、颜色、texcoords,所有这些数据都是正确的。我通过调用来创建缓冲区

[device newBufferWithBytes:data length:length options:0]

这是我在捕获帧时看到的:

编辑:我还注意到这发生在我第一次创建 MTLBuffer 时,我尝试先为颜色数据创建 MTLBuffer,然后为位置和颜色损坏并且位置很好。

知道是什么原因造成的吗?

【问题讨论】:

  • 您的newBufferWithBytes:... 通话中的length 是什么?创建后做[buffer didModifyRange:NSMakeRange(0, length)] 有帮助吗? (应该没有必要,但你永远不知道。)
  • @KenThomases 两个流(MTLBuffers、位置和颜色)都是 128,这是正确的。两个缓冲区都有 4096B 分配的大小。顺便说一句,目前我并不真正关心缓冲区创建的性能,也就是我不创建暂存缓冲区来上传数据,所以我的缓冲区是共享的(我有英特尔 GPU,所以没关系),因此我不能调用didModifyRange,因为这仅对私有缓冲区有效

标签: c++ metal


【解决方案1】:

我终于找到了一个问题。我使用的是带有 XCode-Beta 的 MacOS 10.15 Catalina Beta (19A501i)。我尝试在非 beta 版本的 XCode 中构建应用程序,即使在 gpu 调试器中检查了这些缓冲区之后,一切似乎都是正确的。

我之前使用的是 Xcode-beta(版本 11.0 beta (11M336w)),这似乎是个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2015-01-30
    • 2014-03-17
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多