问题标签 [mtlbuffer]

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.

0 投票
0 回答
187 浏览

ios - 将音频 CMSampleBuffer 转换为 MTLBuffer

CMSampleBuffer将音频缓冲区转换为缓冲区的最有效方法是什么MTLBuffer?我还想尽可能有效地将MTLBuffer缓冲区转换回CMSampleBuffer缓冲区。

我是否需要先将音频转换CMSampleBuffer为 NSData,然后使用makeBuffer(bytesNoCopy pointer: UnsafeMutableRawPointer, length: Int, ...)?还是有更直接的方法?

0 投票
1 回答
1410 浏览

ios - 创建后更改 MTLBuffer 的值

我希望能够定义一个 MTLBuffer 并将数据直接填充到缓冲区(或尽可能高效地)。

如果我执行以下操作,着色器中使用的值是 1.0 和 2.0(分别用于 X 和 Y),而不是在MTLBuffer创建后设置的 3.0 和 4.0。

根据文档,我似乎需要调用didModifyRange:pointDataBuffer似乎无法识别选择器。

有没有办法更新数组而不必重新创建 MTLBuffer?

0 投票
1 回答
151 浏览

xcode - Swift 3 / Xcode 9. MTLBuffer 'didModifyRange' 不可用

我试图告诉 MTLBuffer 范围已更改,但编译器不会让我这样做:

它只是说:“didModifyRange”不可用,为什么?

谢谢

0 投票
0 回答
199 浏览

c++ - 以一种非常奇怪的方式更新金属纹理

我正在尝试使用 Metal 编写蒙特卡洛路径跟踪器。我让整个管道(几乎)正常工作。我有一些奇怪的条带问题,但这似乎与我的路径跟踪逻辑有关,而不是与金属有关。

对于可能没有使用路径跟踪器经验的人来说,它的作用是从相机生成光线,在给定深度(在我的情况下为 8)的随机方向上围绕场景反弹,并且在每个交叉点/反弹时,它都会遮蔽射线与该材料的颜色。最终目标是通过一次又一次地平均多次迭代来“收敛”成一个非常漂亮和干净的图像。在我的代码中,我的金属计算管道一遍又一遍地运行,管道代表一个迭代。

我构建计算管道的方式是使用以下阶段:

  • 生成光线

  • 循环 8 次(即反弹光线 8 次):

    1 - 计算光线交点并将其从该交点反弹(重新计算方向) 2 -color基于该交点“着色”光线

  • 通过获取当前纹理缓冲区的颜色,将其乘以iteration然后将光线的颜色添加到其中,然后除以 来获取所有迭代的平均值iteration+1。然后将新的存储combined_color在相同的确切缓冲区位置。

因此,在更高的层次上,我的整个Renderer工作是:

1 - 在计算着色器中进行一堆光线计算 2 - 更新缓冲区(这是MTKView的可绘制对象)

问题在于,由于某种原因,我的纹理在 3 个不同级别的颜色累积之间循环,并且在不同颜色之间不断出现故障,就好像有三个不同的程序试图写入同一个缓冲区一样。这不可能是由于竞争条件,因为我们正在从同一个缓冲区位置读取和写入,对吧?这怎么可能发生?

这是我前几次迭代的系统跟踪:

系统跟踪概述

如您所见,在最初的几次迭代中,由于某种原因它不会渲染任何东西,而且速度非常快。我不知道为什么会这样。然后,迭代非常慢。这是第一部分的特写: 系统跟踪特写

我试过每次只输出一个迭代的颜色,看起来非常好。我的图片没有收敛到干净的图像(这是多次迭代平均后发生的情况)

我尝试过使用信号量来同步事物,但我最终得到的只是一个停滞的程序,因为我一直在等待命令缓冲区,并且由于某种原因它永远不会准备好。我想我可能只是没有得到信号量。我试过查资料,我似乎做得对。

帮助..我已经在这个错误上工作了两天。我无法修复它。我什么都试过了。我只是不够了解,甚至无法开始辨别问题。这是该项目的链接。系统跟踪文件可以在System Traces/NaiveIntegrator.trace. 我讨厌只粘贴我的代码,而且我知道 SO 不建议这样做,但问题是我只是不知道错误可能在哪里。我保证一旦问题得到解决,我将在此处粘贴相关的代码片段。

如果你运行代码,你会看到一个简单的康奈尔盒子,中间有一个黄色的球体。如果您让代码运行一段时间,您会看到循环中的第三个图像最终会收敛到一个像样的图像(忽略可能无关紧要的地板上的条带效应)。但问题是图像在 3 个不同的图像之间不断闪烁。

0 投票
1 回答
818 浏览

swift - 使用 MTLTexture 作为 SCNScene 的环境贴图

我想将一个对象设置为场景的环境图,因为根据文档MTLTexture似乎是可能的。我可以使用以下代码将环境贴图设置为:UIImage

这很有效,我看到图像在金属物体上的反射。我尝试将图像转换为 aMTLTexture并使用以下代码将其设置为环境贴图:

但是,这不起作用,我最终得到一个空白的环境贴图,我的对象没有反射。

此外,我没有设置optionsas nil,而是尝试使用它可以获得的所有可能值MTKTextureLoader.Option.textureUsage设置密钥,但这也不起作用。

编辑:您可以查看repo 中的示例项目并使用它来重现此用例。

0 投票
1 回答
1092 浏览

ios - Metal newBufferWithBytes 用法

我有一个关于分配新金属设备缓冲区的基本问题。我看到的大多数示例代码在设置时创建 MTLBuffer 并且不修改它。但我想知道顶点数据是否在每次渲染调用时都在变化,是否可以每次创建一个新的 MTLBuffer(使用 -[MTLBuffer newBufferWithBytes:length:option])来将数据发送到在 GPU 上运行的着色器,或者,应该 MTLBuffer给定大小创建一次,但每次渲染调用都会修改字节?根据最佳实践,推荐的方法是什么?

0 投票
2 回答
1846 浏览

ios - MTLBuffer分配+CPU/GPU同步

我正在使用金属性能着色器(MPSImageHistogram)来计算MTLBuffer我抓取的东西,执行计算,然后通过MTKView. 着色器的MTLBuffer输出很小(~4K 字节)。所以我MTLBuffer为每个渲染通道分配一个新对象,每个视频帧每秒至少有 30 个渲染。

我的问题-

  1. 每次使用都可以创建一个新缓冲区device.makeBuffer(..),还是更好地静态分配几个缓冲区并实现重用这些缓冲区?如果重用更好,我们如何在这些缓冲区上同步 CPU/GPU 数据写入/读取?

  2. 另一个不相关的问题,可以在MTKView非主线程上绘制结果吗?还是MTKView只能在主线程中进行绘制(即使我读到 Metal 是真正的多线程)?

0 投票
1 回答
928 浏览

ios - 来自 MTLBuffer 问题的 MTLTexture

我将计算着色器的结果存储在 MTLBuffer 中。MTLBuffer 的每个元素都是一个 UInt16。我试图将结果传递给片段着色器,该着色器通过将 MTLBuffer 的元素解释为 0 到 255 之间的颜色强度来显示结果。我使用以下代码从这个 MTLBuffer 创建一个 MTLTexture 并将纹理传递给着色器。但我认为在这个过程中有些地方是不正确的,因为输出不正确。我不确定这是否是像素格式和/或格式转换的问题。

这是片段着色器代码,

0 投票
2 回答
2143 浏览

swift - 收到错误消息“[CAMetalLayerDrawable texture] 不应在已经呈现此可绘制对象后调用。改为获取 nextDrawable。”

我只需要同时渲染多个对象。但我收到一个错误作为提及。在这里,我将多个对象传递给我的渲染函数。

其中render()类如下

但我收到日志错误消息:

[CAMetalLayerDrawable 纹理] 不应在已呈现此可绘制对象后调用。取而代之的是 nextDrawable 。

有人有线索吗?

0 投票
1 回答
752 浏览

swift - 访问金属中的特定像素集 MTLTexture

我创建了一个MTLTexture使用UIImage数据,如下所示。

我需要做的是改变像素颜色MTLTexture。不是所有的人。那么,是否可以MTLtexture在 Metal 中访问一组特定的像素并写入其中?