Metal SCNProgram - 无法渲染具有视频内容的 SpriteKit 场景

2024-01-01

我(拼命地)尝试使用视频作为 SCNScene 中的纹理以及一些奇特的着色器修改器。我想使用 SCNProgram 来完成该部分。我刚刚拿了一个here https://stackoverflow.com/a/37738386/2054629:

#include <metal_stdlib>

using namespace metal;

#include <SceneKit/scn_metal>

struct MyNodeBuffer {
    float4x4 modelTransform;
    float4x4 modelViewTransform;
    float4x4 normalTransform;
    float4x4 modelViewProjectionTransform;
};

typedef struct {
    float3 position [[ attribute(SCNVertexSemanticPosition) ]];
    float2 texCoords [[ attribute(SCNVertexSemanticTexcoord0) ]];
} MyVertexInput;

struct SimpleVertex
{
    float4 position [[position]];
    float2 texCoords;
};

vertex SimpleVertex myVertex(MyVertexInput in [[ stage_in ]],
                             constant SCNSceneBuffer& scn_frame [[buffer(0)]],
                             constant MyNodeBuffer& scn_node [[buffer(1)]])
{
    SimpleVertex vert;
    vert.position = scn_node.modelViewProjectionTransform * float4(in.position, 1.0);
    vert.texCoords = in.texCoords;

    return vert;
}

fragment half4 myFragment(SimpleVertex in [[stage_in]],
                          texture2d<float, access::sample> diffuseTexture [[texture(0)]])
{
    constexpr sampler sampler2d(coord::normalized, filter::linear, address::repeat);
    float4 color = diffuseTexture.sample(sampler2d, in.texCoords);
    return half4(color);
}

它只是在几何体上显示纹理。我现在正在创建一个 SceneKit 场景,添加一个使用 SCNProgram 的简单立方体,创建一个包含简单正方形的 SpriteKit 场景,并将此 SpriteKit 场景作为纹理传递到我的立方体。它工作正常:

class ViewController: UIViewController {
  @IBOutlet weak var scnView: SCNView!

  let fragmentModifier = try! String(contentsOfFile: Bundle.main.path(forResource: "fragment", ofType: "shader")!)
  var videoLayer: AVPlayerLayer!
  var videoPlayer: AVPlayer!

  override func viewDidLoad() {
    super.viewDidLoad()

    setupVideo()

    // Do any additional setup after loading the view, typically from a nib.
    scnView.showsStatistics = true
    scnView.allowsCameraControl = true

    let scnScene = SCNScene()
    scnView.scene = scnScene

    // setup SceneKit scene
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 25)
    scnScene.rootNode.addChildNode(cameraNode)

    let cubeNode = SCNNode()
    cubeNode.geometry = SCNBox(width: 5, height: 5, length: 5, chamferRadius: 0)
    scnScene.rootNode.addChildNode(cubeNode)

    // setup SpriteKit Scene
    let skScene = SKScene()
    skScene.backgroundColor = UIColor.black
    skScene.size = CGSize(width: 100, height: 100)

    // a simple green square
    let skNode = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 20, height: 20))
    skNode.fillColor = UIColor.green
    skNode.position = CGPoint(x: 5, y: 5)

    // a node to hold a video
    let skVideoNode = SKVideoNode(avPlayer: videoPlayer)
    skVideoNode.size = CGSize(width: 100, height: 100)
    skVideoNode.position = CGPoint(x: 5, y: 5)

    skScene.addChild(skNode)
    // skScene.addChild(skVideoNode)

    let material = cubeNode.geometry!.firstMaterial!
    createProgram(for: material)

    let textureProperty = SCNMaterialProperty(contents: skScene)
    material.setValue(textureProperty, forKey: "diffuseTexture")
  }

  func setupVideo() {
    let item = AVPlayerItem(url: URL(fileURLWithPath: Bundle.main.path(forResource: "test", ofType: "mp4")!))
    let player = AVPlayer(playerItem: item)
    let layer = AVPlayerLayer(player: player)
    videoLayer = layer
    videoPlayer = player
    player.play()
  }

  func createProgram(for material: SCNMaterial) {
    let program = SCNProgram()
    program.fragmentFunctionName = "myFragment"
    program.vertexFunctionName = "myVertex"

    material.program = program
  }
}

现在,如果我用精灵套件场景中的视频节点替换正方形,即我现在要做的:

// skScene.addChild(skNode)
skScene.addChild(skVideoNode)

输出只是纯黑色。视频确实正在播放并输出声音。如果相关的话,我使用的是 iOS 10.0.1。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Metal SCNProgram - 无法渲染具有视频内容的 SpriteKit 场景 的相关文章

  • 从 IP 地址获取主机名 iOS 10

    我需要获取主机名 从 IP 地址 我能够获取连接到我的设备网络的所有设备的 IP MAC 地址 但是主机名总是返回 nil 我曾尝试使用下面的代码片段来检索主机名 但它在我的网络中总是返回 nil 代码片段 1 NSString getHo
  • iOS 14 上的 Arkit/SceneKit 抛出新警告(金属)

    自从升级到 iOS14 以来 每当我向场景添加基本节点时 我都会收到金属警告 我不使用任何阴影 只使用标准材质 2020 09 24 18 51 04 548764 0100 Arvie AR 383 7987 Metal Compiler
  • 如何使用鼠标改变OpenGL相机

    我正在尝试在 OpenGL 中设置一个相机来查看 3 维中的一些点 为了实现这一点 我不想使用旧的 固定的功能样式 glMatrixMode glTranslate 等 而是自己设置模型视图投影矩阵并在我的顶点着色器中使用它 正交投影就足够
  • SKScene 中的 Segue 到 UIViewController

    在我的 GameScene swift 文件中 我尝试执行返回到我的菜单视图控制器的操作 如下所示 func returnToMainMenu var vc UIViewController UIViewController vc self
  • 在 SceneKit 游戏中为 SCNNode 制作 SCNConstraint (LookAt) 动画以使过渡逐渐进行

    一般来说 当你想让游戏中的角色面对镜头时 可以使用 SCNLookAtConstraint 这实际上也对我很有帮助 Below 我的对象是我试图根据约束定向的节点 Enemy 指的是场景中的某个节点 pointOfView 是场景的视角 当
  • xcode9 / SceneKit - .dae 文件未加载到 SCNScene 中 - 返回 nil

    我正在尝试使用以下代码将 dae 文件加载到 SCNScene 中 let solutionScene SCNScene named art scnassets level1 dae print solutionScene rootNode
  • OpenGL:多个顶点的单个顶点属性?

    我有一个接受以下属性的顶点着色器 a posCoord 顶点位置 a texCoord 纹理坐标 传递给片段着色器 a alpha 透明度因子 传递给片段着色器 我正在渲染的对象都是 广告牌 一对直角三角形组成一个矩形 我正在使用一次调用g
  • 如何将 CIPixellate Core Image Filter 添加到 Sprite Kit 场景?

    如何将 CIPixellate Core Image Filter 添加到 Sprite Kit 场景 我有一个 SpriteKit 场景 它是 SKScene 或其子类 我想向场景添加一个核心图像滤镜 特别是 CIPixellate 过滤
  • 调用 SKLabelNode 时出现延迟?

    我在从一个版本转换时遇到了轻微延迟 滞后 的问题SKScene到另一个 通过注释掉各种代码 我将其范围缩小到SKLabelNode 我的猜测是 这就是它在调用时加载 缓存字体 这会导致在声明新字体时出现小的延迟 口吃SKScene 有没有其
  • iOS 10 通知内容扩展未加载

    我有一个简单的应用程序来处理推送通知 我的通知服务扩展正在运行 我可以发送带有图像 URL 的远程通知并加载它 我似乎无法让通知内容扩展正常工作 我已经看过多个教程 他们都说 只需从目标菜单创建一个通知内容扩展 然后在通知内容扩展 Info
  • 创建透明渐变并将其用作 SpriteKit 中的 alpha 遮罩

    我正在尝试制作渐变并将其用作 alpha 蒙版 现在 我能够制作与此类似的图像 从黑色到透明 这是我用来实现这一切的代码 private func createImage width CGFloat height CGFloat gt CG
  • 检查 ARReferenceImage 是否在相机视图中不再可见

    我想检查一下是否AR参考图像 https developer apple com documentation arkit arreferenceimage在相机视图中不再可见 目前我可以检查图像的节点是否在相机的视图中 但是当AR参考图像
  • '#selector' 的参数不引用 '@objc' 方法 (swift 3)

    我正在 SKScene 中设置滑动识别 我发现对所有识别器进行硬编码需要时间 而且不太整洁 所以我决定使用 for 循环和包含以下内容的字典 UISwipeRecognizers 作为键 并且 函数作为值 问题是 在尝试使用添加目标时 它给
  • 指定随机粒子起始颜色而不进行动画更改?

    有没有办法让粒子根据当前的 颜色渐变 产生随机的每个粒子颜色 粒子在其生命周期内不会改变颜色 它们只是在出生时从 颜色渐变 的某个地方被分配了一种颜色 并保持该颜色直到它们死亡 其结果将是出生时的粒子与从红色到蓝色的混合颜色的混合 在我的测
  • Unity3D:在 AA 解析后绘制粒子以提高性能

    我正在尝试评估 MSAA 对 Unity 中含有大量粒子的场景的影响 为此 我需要 使用 8x MSAA 绘制场景中的所有非粒子对象 使用上一个通道中解析的深度缓冲区来渲染所有 将非遮挡粒子系统转移到较小的渲染目标上 将 2 的颜色缓冲区与
  • SpriteKit:如何使用混合模式在图层中打孔

    我有一个简单的场景 添加了一些元素 现在我想专注于一个带有遮罩的特定元素 在与我想要关注的元素相同的位置切割整个元素 与我们在某些游戏第一次启动时看到的显示某种教程非常相似 基本上我添加了一个全屏层alpha 0 7 因此用户仍然可以看到所
  • 检查SCNNode SCNAction是否完成

    我创建了一个 SceneKit 3D 迷宫世界 玩家可以在其中移动 有些动作 例如跳跃 涉及上下移动相机 同时在几秒钟的时间内改变视角方向 在此期间 我想忽略用户的点击和滑动 这通常会导致其他类型的运动 例如转身和向前移动 我可以创建一个与
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • SKShapeNode(circleOfRadius) 在 OSX 的 Playground 中导致“无法识别的选择器发送到类”

    以下操场会导致时间线错误 无法识别的选择器发送到类 import SpriteKit let node SKShapeNode circleOfRadius 10 截屏 https i stack imgur com rPK5J png 当
  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某

随机推荐