问题标签 [metalkit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 金属颜色表示问题(使用 sRGB 像素格式)
如果 CAMetalLayerpixelFormat
设置为rgba8Unorm_srgb
. 正确的意思是我的 UIColor 和 UIImage 在 Metal 中应该和 UIKit 一样。我发现如果我的 CAMetalLayer pixelFormat 是rgba8Unorm
. 但我真的需要使用rgba8Unorm_srgb
.
我附上了这个项目的两个截图。它有一个平方的 CAMetalLayer。它的灰色背景颜色是它的MTLRenderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1)
. 它也有白色和黑色的四边形,还有一个上面有红色渐变的四边形,实际上使用了标准的 alpha 混合:
两个屏幕截图之间的唯一区别是它们的 CAMetalLayer 像素格式。但正如你所看到的,即使是透明的颜色也已经不同了。(它们实际上通过伽马校正完全不同)。白色和黑色是相同的,但所有其他颜色也不同。Alpha 混合也无法正常工作rgba8Unorm_srgb
:您可以看到,它在白色目标上的一半是不饱和的,而在黑色目标上的一半是过饱和的。
据我了解,我不需要担心伽玛校正,不需要修改我的着色器或颜色。无论pixelFormat如何,Metal都应该在线性空间中进行所有数学运算。那么为什么会这样呢?
ios - 金属计算着色器线程组和线程执行宽度
有人可以简单地解释一下金属计算着色器和其他术语(如 SIMD 组、threadExecutionWidth(波前))中的线程组概念是什么吗?我阅读了文档,但更困惑。例如,如果我有一个 1024x1024 的图像,我可以有多少个线程组,我如何将线程映射到每个像素,可以同时运行多少个等等?我找不到描述计算着色器和这些概念的 WWDC 视频。
ios - 金属着色器 3D 纹理查找
我从 iOS 上的 LUT 文件创建了一个 3D 纹理,如下所示:
然后我尝试在片段着色器中使用这个LUT,如下所示:
恐怕我没有得到正确的结果。代码中的一切都完美吗?我是否正确采样了 3d 纹理?
ios - Metal makeComputeCommandEncoder 断言失败
我正在尝试设置和执行计算内核并将其输出提交给 MTKView 进行绘制。但我得到以下崩溃:
下面的代码有什么问题?是否使用相同的 commandBuffer 将计算着色器的输出馈送到渲染管道?
ios - 金属着色器在缓冲区中插入值
我需要将一个缓冲区传递给 Metal 片段着色器,它是一个包含 N 个浮点值的数组。但是如果绘制纹理的宽度超过 N 个像素,我希望着色器插入值。如果我使用纹理,很容易使用采样器并设置线性过滤,但不清楚是否可以在片段着色器中的任意缓冲区上设置插值。
ios - MTLBuffer分配+CPU/GPU同步
我正在使用金属性能着色器(MPSImageHistogram
)来计算MTLBuffer
我抓取的东西,执行计算,然后通过MTKView
. 着色器的MTLBuffer
输出很小(~4K 字节)。所以我MTLBuffer
为每个渲染通道分配一个新对象,每个视频帧每秒至少有 30 个渲染。
我的问题-
每次使用都可以创建一个新缓冲区
device.makeBuffer(..)
,还是更好地静态分配几个缓冲区并实现重用这些缓冲区?如果重用更好,我们如何在这些缓冲区上同步 CPU/GPU 数据写入/读取?另一个不相关的问题,可以在
MTKView
非主线程上绘制结果吗?还是MTKView
只能在主线程中进行绘制(即使我读到 Metal 是真正的多线程)?
swift - Swift MetalKit 未知返回类型 MTKMesh.newMeshes
到目前为止,我一直在关注一个教程(大约在 Metal 1 时发布)来学习 Metal。到目前为止,我还没有遇到任何我无法弄清楚的错误。我正在尝试执行此代码
我得到的错误是Cannot assign value of type '(modellOMeshes: [MDLMesh], metalKitMeshes: [MTKMesh])' to type '[AnyObject]?'
什么是 type of MTKMesh.newMeshes
,如何将其存储在变量中?我尝试投射它as! [AnyObject]
,但后来 xcode 告诉我这个投射每次都会失败。
ios - 来自 MTLBuffer 问题的 MTLTexture
我将计算着色器的结果存储在 MTLBuffer 中。MTLBuffer 的每个元素都是一个 UInt16。我试图将结果传递给片段着色器,该着色器通过将 MTLBuffer 的元素解释为 0 到 255 之间的颜色强度来显示结果。我使用以下代码从这个 MTLBuffer 创建一个 MTLTexture 并将纹理传递给着色器。但我认为在这个过程中有些地方是不正确的,因为输出不正确。我不确定这是否是像素格式和/或格式转换的问题。
这是片段着色器代码,
scenekit - Metal 2:MetalKit (MTKView) 和 SceneKit 互操作性
我正在使用 MetalKit 并且有一个复杂的渲染管道。结果被渲染到 MTKView 中。
现在我想将 MTKView 的内容提供给 SCNScene 并使用 SCNCamera 执行 HDR 等后处理效果。
这怎么可能?
我不想要一般的方向。如果可能的话,我想要特定的电话。
ios - 金属性能调试
我在 iOS 上有一个 Metal 应用程序,我在其中获取视频帧并将每个帧传递给多个着色器,其中一些是在多个通道中应用的计算着色器,其中 4 个是独立的 MTKViews,它们显示计算的纹理(例如,直方图)以及视频预览. 有时(但并非总是)在 iPhone 6s 等旧硬件上,我注意到应用程序变得过于缓慢,帧速率下降到每秒 1 或 2 帧。请让我知道如何调试阻塞 GPU/GPU 的 Metal 着色器以及如何优化 Metal 相关代码的性能。