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



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

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

问题是当我从常量交换到结构均匀颜色时,颜色根本不匹配。使用此处的比较,我尝试传入 float3 (import simd( 和SCNVector3.

如何确保我在着色器中使用的常量 float3 在我从 Swift 传入时将以相同的方式表示?

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

最新更新