如何使用 Swift 将 Float 制服传递给 iOS 金属着色器?

Posted

技术标签:

【中文标题】如何使用 Swift 将 Float 制服传递给 iOS 金属着色器?【英文标题】:How do I pass a Float uniform to iOS Metal shader using Swift? 【发布时间】:2014-12-05 14:08:12 【问题描述】:

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

这是我的着色器:

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?

如何传递单个浮点值?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

您也可以在 10.11+ 和 ios 9+ 中使用:

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

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

【讨论】:

也许这很明显,但是 OP 的问题有一个顶点着色器,setFragmentBytes 将数据发送到片段着色器,所以如果像 OP 你想将数据发送到顶点着色器,请改用 setVertexBytes

以上是关于如何使用 Swift 将 Float 制服传递给 iOS 金属着色器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将mat4数组作为制服传递

如何使用swift将功能传递给网页?

Swift:如何将信息传递给弹出视图?

通过多个类传递 OpenGL 3.0 制服的问题

如何将 C_FLOAT 数组传递给 Fortran 子例程

Swift - 如何将视图控制器的引用传递给子 UIView 类?