将float3从Swift结构传递到金属着色器

时间:2018-08-17 09:33:03

标签: swift floating-point shader scenekit metal

将问题归结为最少的代码,我有一个金属碎片着色器,它返回一种颜色:

constant float3 uSeaColor = float3(0.39216,0.4549,0.51373);

fragment float4 fragmentMain(constant Uniforms& uniforms [[buffer(2)]]){
    return float4(uSeaColor.rgb, 1);
}

这将返回我期望的颜色并按预期工作。但是,我正在尝试通过以下快速结构传递这种颜色(和其他制服):

struct Uniforms {
  var overlayOpacity: Float = 1.0
  var gridAlpha:CGPoint = CGPoint(x: 0.5, y: 0.5)
  var uSeaColor = SCNVector3(0.39216,0.4549,0.51373)
}

var uniforms = Uniforms()
let data = NSData(bytes: &uniforms, length: MemoryLayout.size(ofValue: uniforms))
sphereNode.geometry?.firstMaterial?.setValue(data, forKey: "uniforms")

在我的着色器中,有一个匹配的结构:

struct Uniforms {
  float overlayOpacity;
  float2 girdAlpha;
  float3 uSeaColor;
}

问题是,当我从常量更改为结构统一颜色时,该颜色根本不匹配。使用来自here的比较,我尝试传递float3(import simd)和SCNVector3

当我从Swift传递给着色器时,如何确保以相同的方式表示着色器中使用的常量float3?

1 个答案:

答案 0 :(得分:0)

使用从表here中读取的内容,我的结构具有多种类型,我将float2作为CGPoint传递。更改类型以使其与金属着色器中的内容完全匹配,从而解决了我所有的问题。回想起来很明显。