【问题标题】:In a MTKView How to get pixel information ( RGB and Alpha values ) of a given point in 3D (x,y,z)?在 MTKView 中如何获取 3D (x,y,z) 中给定点的像素信息(RGB 和 Alpha 值)?
【发布时间】:2018-05-20 01:06:44
【问题描述】:

好的,我们在MTKView 中绘制了几个东西,我们可以使用 Metal、MetalKit 函数移动和转动它们,但我们无法获取 3D (x,y,z) 中给定点的像素信息。我们搜索了几个小时,但找不到任何解决方案。

【问题讨论】:

    标签: ios swift metal metalkit


    【解决方案1】:

    这似乎是一个经典案例,试图咨询您的视图(在模型-视图-控制器范式意义上)以获取模型所拥有的信息。直接咨询您的模型。

    像 Metal 这样的 3D 渲染技术就是将 3D 信息扁平化为 2D 并有效地丢弃与该 2D 表示无关的信息。在渲染结束时,Metal 和 MTKView 都没有关于 3D 点的任何信息。

    另外请注意,您的模型可能没有任意 3D 点的信息。很可能您的所有 3D 模型(在术语的另一个意义上)都是壳。它们没有内部,只有表面。因此,除非 3D 点正好落在表面上,而不是完全不在模型内部或外部,否则它没有颜色。

    【讨论】:

    • 是的,目前我正在检查我的模型数组,但我正在 CPU 中进行。当阵列变大时,这是一个问题。我不想那样做。必须有办法在 GPU 中做到这一点。我还不知道!能够在 Metal View 上执行此操作会非常快,就像我可以在常规视图上执行 2D 一样。
    • 也许可以在更高的抽象层次上准确解释您要做什么。您是否正在尝试进行命中测试?您真的对 3D 点感兴趣,还是对渲染图像中 2D 点的颜色感兴趣?兴趣点来自哪里,它代表什么?
    • 是的命中测试,我现在在 3D 对象坐标矩阵中进行测试,而不管金属。这意味着我正在使用对象的坐标和大小。只要图纸不重,它就可以很好地工作。
    【解决方案2】:

    无法从 3D 模型空间获取颜色,但可以从 2D 视图空间获取颜色。

    func getColor(x: CGFloat, y: CGFloat) -> UIColor? {
    
        if let curDrawable = self.currentDrawable {
            var pixel: [CUnsignedChar] = [0, 0, 0, 0]  // bgra
    
            let textureScale = CGFloat(curDrawable.texture.width) / self.bounds.width
            let bytesPerRow = curDrawable.texture.width * 4
            let y = self.bounds.height - y
            curDrawable.texture.getBytes(&pixel, bytesPerRow: bytesPerRow, from: MTLRegionMake2D(Int(x * textureScale), Int(y * textureScale), 1, 1), mipmapLevel: 0)
            let red: CGFloat   = CGFloat(pixel[2]) / 255.0
            let green: CGFloat = CGFloat(pixel[1]) / 255.0
            let blue: CGFloat  = CGFloat(pixel[0]) / 255.0
            let alpha: CGFloat = CGFloat(pixel[3]) / 255.0
            let color = UIColor(red:red, green: green, blue:blue, alpha:alpha)
            return color
        }
        return nil 
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      相关资源
      最近更新 更多