2017-01-27 1 views
1

Je me suis cogné la tête pendant des jours. Je suis en train d'apprendre le métal et la programmation graphique, j'ai généré des données de terrain valides et des triangles pour cela, j'ai mis en place des transformations et j'ai fait apparaître des choses à l'écran (pas un petit exploit)! Mais il ne dessinera qu'un certain nombre de triangles et s'arrêtera.Débordement du début du vertex du shader métallique

Après des charges de débogage je trouve qu'il arrête toujours entre le tampon de décalage 0xFFF0 et 0x10008 qui se trouve être là où la fin de uint16. Je ne sais pas pourquoi ce serait le cas, mais c'est la seule chose que je peux penser.

Mon tampon est composé de struct défini comme:

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

Je mon vertex shader mis en place comme:

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; 

}

J'ai le vertex_id déclaré comme uint ce que je suppose serait probablement 32 bits. Je ne sais pas pourquoi cela se produirait.

J'ai débogué les tampons et toutes les données sont là et correct il arrête juste de dessiner des triangles après ce point.

les triangles Débogage il se termine toujours comme ça:

broken triangle

Les données de ce triangle cassé dans la mémoire tampon est pas ce qui est en cours d'élaboration. Les appels de tirage sont drawPrimitives simples, j'ai été, mais ils déboguent ressemblent:

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

Quelqu'un at-il vu cela et savent ce qui se passe?

Répondre

2

J'ai trouvé la solution. Apparemment le problème était de déclarer le MetalVertex* comme constant dans le vertex shader

En le déclarant comme device et tout fonctionne comme par magie.