проблемы в Apple Metal API "setVertexBuffer: offset: atIndex:" - PullRequest
1 голос
/ 08 ноября 2019

Я новичок в Apple Metal, когда запускаю пример кода яблока " Создание и выборка текстур ", я обнаружил что-то странное, " Рисунок 1 " - результат в моем Macmini 2018 (графический процессор Intel® RHD Graphics 630) , вы можете видеть, что левый нижний угол четырехугольника сжимается, исходный источник использует setVertexBuffer:offset:atIndex: для установки буфера вершин, я заменяю его на setVertexBytes:length:atIndex:и запустите, результат отобразится как " Figure 2 ", кажется, что все идет хорошо, затем я собираю и запускаю источник источника на другой машине ( Macbookpro, GPU - GeForce GT 750M )четверка отображается правильно, результат отображается как " Figure 2 ", поэтому источник чего-то не хватает или есть какие-то проблемы в функции setVertexBuffer:offset:atIndex:?

Figure 1

figure 1

Рисунок 2

Figure 2

// Apple's origin source
//
static const AAPLVertex quadVertices[] =
    {
        // Pixel positions, Texture coordinates
        { {  250,  -250 },  { 1.f, 1.f } },
        { { -250,  -250 },  { 0.f, 1.f } },
        { { -250,   250 },  { 0.f, 0.f } },

        { {  250,  -250 },  { 1.f, 1.f } },
        { { -250,   250 },  { 0.f, 0.f } },
        { {  250,   250 },  { 1.f, 0.f } },
    };
...
...
...
//Create a vertex buffer, and initialize it with the quadVertices array
_vertices = [_device newBufferWithBytes:quadVertices
                                length:sizeof(quadVertices)
                               options:MTLResourceOptionCPUCacheModeDefault];
...
...
// set the vertex buffer
[renderEncoder setVertexBuffer:_vertices
                        offset:0
                      atIndex:AAPLVertexInputIndexVertices];

Я делаю квадратные вершины какглобальный массив и замените "setVertexBuffer: offset: atIndex:" на "setVertexBytes: length: atIndex:"

[renderEncoder setVertexBytes:&quadVertices
                       length:sizeof(quadVertices)
                       atIndex:AAPLVertexInputIndexVertices];

1 Ответ

0 голосов
/ 09 ноября 2019

Наконец, я изменил тип MTLResourceOptions на «MTLResourceCPUCacheModeWriteCombined» в функции создания буфера, проблема решена.

_vertices = [_device newBufferWithBytes:quadVertices
                                 length:sizeof(quadVertices)
             options:MTLResourceCPUCacheModeWriteCombined];

Теперь пример отлично работает в обоих MacMini 2018 (графический процессор Intel (R) UHD Graphics)630) и Macbookpro (графический процессор GeForce GT 750M).

...