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];
所以,我們只是使偏移量等於上一個緩衝區佔用的內存大小。請注意,如果我們將最後一行註釋掉,第一個三角形將按預期呈現。
任何人都不知道我錯過了什麼?我真的很感激。
問候
offset參數表示到提供的緩衝區中數據開頭的偏移量。如果你爲每個對象使用單獨的緩衝區,那麼偏移量不應該總是爲0嗎? – warrenm
@warrenm你其實是完全正確的,男人!它現在工作完美,謝謝!不知道是什麼讓我覺得它爲前一個添加了新的緩衝區... –