swift - 将 float3 从 Swift 结构传递到 Metal 着色器

标签 swift floating-point shader scenekit metal

将问题归结为最少的代码,我有一个返回颜色的 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

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

最佳答案

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

关于swift - 将 float3 从 Swift 结构传递到 Metal 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51892429/

相关文章:

ios - Spritekit : Detect collision while drawing line using finger

dictionary - 带有字典的 iOS 8.1 上的 EXC_BAD_ACCESS

ios - swift 2 : Cannot subscript a value of type '[GKScore]?'

java - 将 Byte[4] 转换为 float - Integer[4] 数组有效但 byte[4] 无效

opengl-es - 使用具有多个颜色纹理附件的 FrameBufferObject

swift - Firebase 存储与游戏数据数据库

python - 通过串行方式将 float 作为字节从 Python 程序发送到 Arduino

javascript - 将Float64Array转换为数组

directx - 着色器链接错误/不匹配

unity3d - 将墨卡托投影转换为等距柱状投影的着色器?