金属API“ setVertexBuffer:offset:atIndex:”中的问题

时间:2019-11-08 13:32:18

标签: metal

我是Apple Metal的新手,运行苹果示例代码“ Creating and Sampling Textures”时,我很喜欢一些奇怪的东西,“ 图1 ”是我的 Macmini 2018的结果(GPU是Intel®UHD Graphics 630),您可以看到四边形的左下角受到挤压,原始源使用setVertexBuffer:offset:atIndex:设置顶点缓冲区,我将其替换为{{1} },然后运行,结果显示为“ 图2 ”,看来一切正常,然后我在另一台计算机上构建并运行了原始源( Macbookpro,GPU是GeForce GT 750M ),四边形是正确渲染的,结果显示为“ 图2 ”,那么源是否丢失了某些东西,或者函数setVertexBytes:length:atIndex:中是否存在某些问题?

图1

 figure 1

图2

 Figure 2

setVertexBuffer:offset:atIndex:

我将quadVertices设为全局数组,并替换

从“ setVertexBuffer:offset:atIndex:”到“ setVertexBytes:length:atIndex:”
// 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];

1 个答案:

答案 0 :(得分:0)

最后,我在缓冲区创建函数中将MTLResourceOptions类型更改为“ MTLResourceCPUCacheModeWriteCombined”,问题已解决。

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

现在该示例在MacMini 2018(GPU为Intel®UHD Graphics 630)和Macbookpro(GPU为GeForce GT 750M)中都可以正常工作。