2017-01-27 1 views
1

Я бил головой об этом в течение нескольких дней. Я просто изучаю программирование в области металла и графики, я создал достоверные данные о местности и треугольники для него, создал некоторые трансформации и фактически обнаружил на экране (не малый подвиг). Но он будет рисовать только определенное количество треугольников, а затем остановиться.Начало переполнения вершины металлического шейдера

После нагрузок отладки я обнаружил, что он всегда останавливается между смещением буфера 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 бит. Я не знаю, почему это произойдет.

Я отлаживал буферы и все данные там, и исправление просто прекращает рисовать треугольники после этой точки.

Отладка треугольников всегда заканчивается так:

broken triangle

Данные для этого разбитого треугольника в буфере не то, что втягивается. Жеребьевка звонки простые 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) 

Кто-нибудь видел это и знать, что происходит?

ответ

2

Я нашел решение. Видимо, проблема была объявляя MetalVertex*, как constant в вершинном шейдере

Декларирование как device и все волшебно работает.

Смежные вопросы