Я борюсь с переносом приложения OpenGL на Metal.В моем старом приложении я связывал два буфера, один с вершинами и соответствующими цветами, а другой с вершинами и соответствующими текстурами, и переключался между ними на основе некоторой логики приложения.Теперь в Metal я начал с примера Hello Triangle , где я попытался запустить этот вершинный шейдер
vertex RasterizerData
vertexShader(uint vertexID [[vertex_id]],
constant AAPLVertex1 *vertices1 [[buffer(AAPLVertexInputIndexVertices1)]],
constant AAPLVertex2 *vertices2 [[buffer(AAPLVertexInputIndexVertices2)]],
constant bool &useFirstBuffer [[buffer(AAPLVertexInputIndexUseFirstBuffer)]])
{
float2 pixelSpacePosition;
if (useFirstBuffer) {
pixelSpacePosition = vertices1[vertexID].position.xy;
} else {
pixelSpacePosition = vertices2[vertexID].position.xy;
}
...
и этот код Objective-C
bool useFirstBuffer = true;
[renderEncoder setVertexBytes:&useFirstBuffer
length:sizeof(bool)
atIndex:AAPLVertexInputIndexUseFirstBuffer];
[renderEncoder setVertexBytes:triangleVertices
length:sizeof(triangleVertices)
atIndex:AAPLVertexInputIndexVertices1];
(где AAPLVertexInputIndexVertices1 = 0
, AAPLVertexInputIndexVertices2 = 1
и AAPLVertexInputIndexUseFirstBuffer = 3
), что должно привести к тому, что vertices2
никогда не будет получен доступ, но все равно я получаю ошибку: failed assertion 'Vertex Function(vertexShader): missing buffer binding at index 1 for vertices2[0].'
Все работает, если я заменяю if (useFirstBuffer)
if (true)
в Металлическом коде.Что не так?