Я бил головой об этом в течение нескольких дней. Я просто изучаю программирование в области металла и графики, я создал достоверные данные о местности и треугольники для него, создал некоторые трансформации и фактически обнаружил на экране (не малый подвиг). Но он будет рисовать только определенное количество треугольников, а затем остановиться.Начало переполнения вершины металлического шейдера
После нагрузок отладки я обнаружил, что он всегда останавливается между смещением буфера 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)
Кто-нибудь видел это и знать, что происходит?