2017-01-27 50 views
1

我一直在這個衝擊我的頭幾天。我只是學習金屬和圖形編程,我已經生成了有效的地形數據和三角形,並設置了一些變換,並將事物實際顯示在屏幕上(無小事)!但它只會繪製一定數量的三角形然後停止。開始的金屬着色器頂點溢出

經過加載調試後,我發現它總是停在緩衝區偏移量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位。我不確定爲什麼會發生這種情況。

我已經調試了緩衝區,所有的數據都在那裏,並糾正它只是停止後繪製三角形點。

調試它總是結束這樣的三角形:

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和一切神奇的作品。