如何使用Swift将Float uniform传递给iOS Metal着色器?

13

我想在我的金属着色器中传递一个浮点数,但我无法弄清楚如何实现。

这是我的着色器:

vertex float4 model_vertex(unsigned int iid[[instance_id]]
                           constant float angle) {
    float number = float(iid) / 64.0;
    return float4(number * sin(angle), number * cos(angle), 0.0, 1.0);
}

现在我想将它传递给着色器:

let renderPassDescriptor = MTLRenderPassDescriptor()
let renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
// ...
let angle: Float = 0.5
renderEncoder.setUniform1(angle) // What do I do here?

如何传递单个浮点数值?

2个回答

13

在10.11及以上版本和iOS 9及以上版本中,您可以使用以下方法:

public func setVertexBytes(bytes: UnsafePointer<Void>, length: Int, atIndex index: Int)

如果您只使用缓冲区一次(且数据长度小于4K),则文档记录了此方法比创建MTLBuffer更好。


2
也许这很明显,但是OP的问题涉及到顶点着色器,而setFragmentBytes发送数据到片段着色器,所以如果像OP一样想要向顶点着色器发送数据,请使用setVertexBytes - Bjorn

10

我以前没有见过setUniform*。要将uniform传递给你的顶点着色器,请使用:

setVertexBuffer(buffer: MTLBuffer?, offset: Int, atIndex index: Int)

在您的示例中,缓冲区将是一个具有单个浮点数的数组。 要向片段着色器传递Uniform,请使用setFragmentBuffer。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接