开始金属着色器顶点溢出

Beginning Metal Shader vertex overflow

几天来我一直在努力解决这个问题。我只是在学习金属和图形编程,我已经为它生成了有效的地形数据和三角形,设置了一些变换并且让东西实际显示在屏幕上(不小的壮举)!但是它只会画一定数量的三角形然后停止。

经过大量调试后,我发现它总是在缓冲区偏移 0xFFF00x10008 之间停止,这恰好是 uint16 的结束位置。我不知道为什么会这样,但这是我唯一能想到的。

我的缓冲区由定义为的结构组成:

struct Vertex {
    float2 position [[ attribute(0) ]];
    float2 tex      [[ attribute(1) ]];
    float shadow    [[ attribute(2) ]];
};

我的顶点着色器设置如下:

vertex FragmentIn terrainVertex(constant MetalVertex* verts [[ buffer(0) ]],
                             constant Constants &mvp [[buffer(1)]],
                            constant ModelMatrix &modelMat [[buffer(2)]],
                             uint v_id [[ vertex_id ]]) {
MetalVertex vert = verts[v_id];

FragmentIn outVertex;
outVertex.position = mvp.viewProjectionMatrix * modelMat.modelMatrix * float4(vert.position.x,vert.position.y,0,1);
outVertex.shadow  = vert.shadow;
outVertex.uv = vert.tex;
return outVertex;

}

我将 vertex_id 声明为一个 uint,我认为它可能是 32 位。我不确定为什么会这样。

我已经调试了缓冲区并且所有数据都在那里并更正它只是在该点之后停止绘制三角形。

调试三角形总是这样结束:

缓冲区中那个破损三角形的数据不是正在绘制的数据。绘图调用是简单的 drawPrimitives,我一直在调试,但它们看起来像:

       renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 1500, instanceCount: 500)
    let count = 411
    renderEncoder.drawPrimitives(type: .triangle, vertexStart: 1500, vertexCount: count * 3, instanceCount: count)

有没有人看到这个并且知道这是怎么回事?

我找到了解决办法。显然问题是在顶点着色器

中将 MetalVertex* 声明为 constant

将其声明为 device 一切都神奇地起作用了。