如何在 macOS 上使用 Metal 与可变端点划清界限?

How to draw a line with variable endpoints with Metal on macOS?

提问人:Leonardo 提问时间:8/25/2022 最后编辑:Hamid YusifliLeonardo 更新时间:8/26/2022 访问量:136

问:

我需要在 macOS 上使用 Metal 在 60 FPS 动画中绘制一条线(光源/光目标),而线的两个端点坐标在每一帧上都会发生变化。

实际上,我可以使用仅包含两个固定端点的 Metal 正确地绘制静态线,但是我在线矩阵上应用的任何转换都会影响两个端点,而不是每个端点独立。MTLBuffer

那么,如何在每次渲染过程中改变两个端点坐标中的每一个呢?有没有办法修改每一帧?我是否应该将两个坐标传递给着色器,然后使用不同的管道来绘制这条线?MTLBuffersetVertexBytes:

macOS的 金属 可变 mtlbuffer

评论


答:

0赞 Leonardo 8/25/2022 #1

我已经找到了解决方案。我在每次渲染过程中修改行 MTLBuffer 内容。我只需设置 2 个端点坐标值,然后设置 vertexBuffer 并画线。

Vertex *vertex = mLineVertexBuffer.contents;
vertex[0].position = lightSourcePos3D.xyz;
vertex[1].position = lightTargetPos3D.xyz;
[cmdEncoder setVertexBuffer:mLineVertexBuffer offset:0 atIndex:0];
[cmdEncoder drawPrimitives:MTLPrimitiveTypeLine vertexStart:0 vertexCount:2];

奇怪的想法是,我的 vertexBuffer 被描述为不可变的,而我似乎仍然可以完美地修改它。

pipelineDescriptor.vertexBuffers[0].mutability = MTLMutabilityImmutable;
1赞 Hamid Yusifli 8/26/2022 #2

奇怪的想法是我的 vertexBuffer 被描述为不可变的 虽然我似乎仍然可以完美地修改它。

如果声明在编码器的参数表中设置缓冲区和关联的命令缓冲区完成执行之间不会修改缓冲区的内容则 Metal 可以提高性能。在此时间间隔内,CPU 或 GPU 都无法更新缓冲区。为了获得更好的性能,请尽可能使用不可变缓冲区。