【发布时间】: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,因为这仅对私有缓冲区有效