我几天来一直在敲打这个问题。我只是在学习金属和图形编程,我已经为它生成了有效的地形数据和三角形,设置了一些变换并且实际显示在屏幕上的东西(不小的壮举)!但它只会绘制一定数量的三角形然后停止。
经过大量调试后,我发现它始终在缓冲区偏移0xFFF0
和0x10008
之间停止。这恰好是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)
有没有人看过这个并知道最新情况?
答案 0 :(得分:2)
我找到了解决方案。显然问题是在顶点着色器中将MetalVertex*
声明为constant
将其声明为device
,一切都神奇地起作用。