2014-10-10 108 views
5

我想將一個浮點數傳遞給我的金屬着色器。我無法弄清楚如何。如何使用Swift將浮點制服傳遞給iOS金屬着色器?

這裏是我的着色器:

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); 
} 

現在我想將它傳遞到shader:

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

我如何通過單一的浮點值?

回答

7

我還沒有看到setUniform *之前。要將制服傳遞到頂點着色器,請使用:

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

在您的示例中,緩衝區將是具有單個浮點的數組。 要將制服傳遞給片段着色器,請使用setFragmentBuffer。

在10.11+和iOS
7

而且9+你可以使用:

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

這是證明是比創造一個更好的MTLBuffer如果你只使用緩衝區一次(和你的數據小於4K長)。

+0

也許這是顯而易見的,但OP的問題有一個頂點着色器和'setFragmentBytes'將數據發送到片段着色,所以如果像OP你想將數據發送到頂點着色器使用'代替setVertexBytes'。 – 2016-08-11 14:36:34

+2

好點。固定。 – 2016-08-12 22:07:35

相關問題