gpt4 book ai didi

swift - SceneKit - 在 SCNNode 上应用 CIFilter 隐藏 SCNTorus

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:53 25 4
gpt4 key购买 nike

我的场景中有以下节点设置:具有子节点的容器节点:earth、torus 和 moon。我将以下带有 CIBloom 和 CISourceOverCompositing 过滤器的自定义 HighlightFilter 应用于地球节点的过滤器属性以实现发光效果:

CIFilter 类(代码来自很棒的博客:Highlighting SCNNode with Glow)

class HighlightFilter: CIFilter {

static let filterName = "highlightFilter"

@objc dynamic var inputImage: CIImage?
@objc dynamic var inputIntensity: NSNumber?
@objc dynamic var inputRadius: NSNumber?

override var outputImage: CIImage? {
guard let inputImage = inputImage else {
return nil
}

let bloomFilter = CIFilter(name:"CIBloom")!
bloomFilter.setValue(inputImage, forKey: kCIInputImageKey)
bloomFilter.setValue(inputIntensity, forKey: "inputIntensity")
bloomFilter.setValue(inputRadius, forKey: "inputRadius")

let sourceOverCompositing = CIFilter(name:"CISourceOverCompositing")!
sourceOverCompositing.setValue(inputImage, forKey: "inputImage")
sourceOverCompositing.setValue(bloomFilter.outputImage, forKey: "inputBackgroundImage")

return sourceOverCompositing.outputImage
}}

我不明白这个看不见的矩形。我认为这是因为 CIFilter SourceOverCompositing 将修改后的图像覆盖在原始图像上。但为什么环面是隐藏的而月亮不是?我将环面 Material 添加到卫星中。 Material 属性,看 Material 有没有问题。但还是一样,月亮是可见的,环面是隐藏的。月亮与一个 helperNode 一起旋转,作为 containerNode 的子节点。

Moon is in visible, but torus not Torus is not visible behind this omninius rectangle

Scenegraph enter image description here

最佳答案

这可能由于两个潜在问题而发生。

解决方案 1

当您使用 CISourceOverCompositing 时,您需要预乘 RGBA 图像 (RGB * A) 作为前景,其中 alpha channel 具有与地球相同的形状(左图片)。但是您有一个覆盖所有图像的 alpha channel (右图)。

如果您想知道地球图像中 Alpha channel 的形状 - 使用以下合成应用程序之一:Foundry Nuke、Adobe After Effect、Apple Motion、Blackmagic Fusion 等。

此外,如果您想分别合成月球和地球,则必须将它们作为两个不同的图像。

enter image description here

在合成中经典的OVER操作有如下公式:

(RGB_image1 * A_image1) + (RGB_image2 * (1 – A_image1))

这个公式的第一部分是预乘前景图像(地球)- RGB1 * A1。

这个公式的第二部分是一个有洞的背景图片——RGB2 * inverted_A1。您已经使用 (1-A) 反转了 alpha channel 。背景图像本身只能包含三个分量——RGB(没有 A)。

然后使用简单的加法运算将两个图像相加。如果您有多个 OVER 操作——这些操作的顺序至关重要。


解决方案 2

这可能是由于深度缓冲区。禁用 writesToDepthBuffer 实例属性。它是一个 bool 值,决定了 SceneKit 在渲染 Material 时是否产生深度信息。

yourTorusNode.geometry?.materials.first?.writesToDepthBuffer = false

enter image description here

希望这对您有所帮助。

关于swift - SceneKit - 在 SCNNode 上应用 CIFilter 隐藏 SCNTorus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com