11

我想将一个浮点数传递给我的金属着色器。我不知道怎么做。

这是我的着色器:

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?

如何传递单个浮点值?

4

2 回答 2

11

同样在 10.11+ 和 iOS 9+ 中,您可以使用:

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

如果您只使用一次缓冲区(并且您的数据长度小于 4K),那么这比创建 MTLBuffer 更好。

于 2015-09-12T20:54:13.097 回答
8

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

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

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

于 2014-10-15T23:07:00.533 回答