2016-01-29 78 views
3

我遇到了一個問題,我只想渲染兩個三角形(每個都存儲在單獨的緩衝區中),Metal API拒絕嘗試渲染第二個頂點緩衝區。我懷疑這是關於對齊。斷言消息是對於vertexArray [0],索引爲0的緩衝區綁定失敗的斷言'(長度 - 偏移量)(0)必須>> 32「。下面的代碼:使用Apple的金屬渲染第二個頂點緩衝區

頂點和常量結構:

struct VertexPositionColor 
{ 
    VertexPositionColor(const simd::float4& pos, 
         const simd::float4& col) 
    : position(pos), color(col) {} 

    simd::float4 position; 
    simd::float4 color; 
}; 
typedef struct 
{ 
    simd::float4x4 model_view_projection; 
} constants_t; 

我這是怎麼儲存,並加入新的緩衝區(函數被調用兩次):

NSMutableArray<id<MTLBuffer>> *_vertexBuffer; 
NSMutableArray<id<MTLBuffer>> *_uniformBuffer; 
NSMutableArray<id<MTLBuffer>> *_indexBuffer; 

- (void)linkGeometry:(metalGeometry*)geometry 
{ 
    [_vertexBuffer addObject:[_device newBufferWithBytes:[geometry vertices] 
             length:[geometry vertices_length] 
             options:0] 
    ]; 

    [_uniformBuffer addObject:[_device newBufferWithLength:[geometry uniforms_length] 
              options:0] 
    ]; 

    RCB::constants_t* guts = (RCB::constants_t*) [[_uniformBuffer lastObject] contents]; 
    guts->model_view_projection = [geometry uniforms]->model_view_projection; 

    [geometry linkTransformation:(RCB::constants_t *)[[_uniformBuffer lastObject] contents]]; 
} 

接下來是斷言失敗的行(最後一行):

[render setVertexBuffer:_vertexBuffer[0] offset:0 atIndex:0]; 
[render setVertexBuffer:_uniformBuffer[0] offset:0 atIndex:1]; 
[render drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:3]; 

[render setVertexBuffer:_vertexBuffer[1] offset:3*sizeof(VertexPositionColor) atIndex:0]; 
[render setVertexBuffer:_uniformBuffer[1] offset:sizeof(constants_t) atIndex:1]; 
[render drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:3 vertexCount:3]; 

所以,我們只是使偏移量等於上一個緩衝區佔用的內存大小。請注意,如果我們將最後一行註釋掉,第一個三角形將按預期呈現。

任何人都不知道我錯過了什麼?我真的很感激。

問候

+2

offset參數表示到提供的緩衝區中數據開頭的偏移量。如果你爲每個對象使用單獨的緩衝區,那麼偏移量不應該總是爲0嗎? – warrenm

+0

@warrenm你其實是完全正確的,男人!它現在工作完美,謝謝!不知道是什麼讓我覺得它爲前一個添加了新的緩衝區... –

回答

3

offset參數表示的偏移量在提供的緩衝區中的數據的開頭。如果您爲每個對象使用單獨的緩衝區,則偏移量應該爲0.

相關問題