【问题标题】:Using stride in metal similar to openGL在金属中使用类似于 openGL 的步幅
【发布时间】:2018-10-11 08:25:28
【问题描述】:

我有一个缓冲区,顶点有一个步幅。我如何在金属中指定这个?我似乎找不到任何例子。 谢谢!

【问题讨论】:

    标签: metal metalkit


    【解决方案1】:

    查看MTLVertexBufferLayoutDescriptor,它是 MTLRenderPipelineDescriptor 的一部分。它有stride 成员。

    下面是设置三个顶点属性以交错方式存储在一个顶点缓冲区中的示例。 stride 设置在末尾旁边:vertexDescriptor.layouts[0].stride = 32;

    MTLRenderPipelineDescriptor *pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
    
    MTLVertexDescriptor *vertexDescriptor = [MTLVertexDescriptor vertexDescriptor];
    vertexDescriptor.attributes[0].offset = 0;
    vertexDescriptor.attributes[0].format = MTLVertexFormatFloat3; // position
    vertexDescriptor.attributes[0].bufferIndex = 0;
    vertexDescriptor.attributes[1].offset = 12;
    vertexDescriptor.attributes[1].format = MTLVertexFormatFloat3; // normal
    vertexDescriptor.attributes[1].bufferIndex = 0;
    vertexDescriptor.attributes[2].offset = 24;
    vertexDescriptor.attributes[2].format = MTLVertexFormatFloat2; // texCoords
    vertexDescriptor.attributes[2].bufferIndex = 0;
    
    vertexDescriptor.layouts[0].stepRate = 1;
    vertexDescriptor.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex;
    vertexDescriptor.layouts[0].stride = 32;
    
    pipelineDescriptor.vertexDescriptor = vertexDescriptor;
    

    【讨论】:

    • 谢谢。着色器顶点部分的方法是什么?我基本上有一个包含 c 结构元素的数组,我知道前 8 个字节是顶点位置所需的 2 个浮点数。我不需要缓冲区中的其余数据。你会如何处理这个问题?
    • 如果从不使用额外的数据,您最好的选择是只保留每个顶点的 8 个字节并用这些数据填充 MTLBuffer(使用 8 的步幅)。如果您想将所有数据存储在 MTLBuffer 中以供 CPU 和 GPU 使用(以避免在 MTLBuffer 和其他一些 CPU 缓冲区中重复位置),您可以指定步幅以匹配每个顶点的数据大小和只需忽略顶点函数中的额外数据。您可以省略在 vertexDescriptor 中设置相应的属性。请注意,与 CPU 共享 MTLBuffer 内存对于非 iOS 可能不切实际
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2012-08-02
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多