问题标签 [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.
ios - 将音频 CMSampleBuffer 转换为 MTLBuffer
CMSampleBuffer
将音频缓冲区转换为缓冲区的最有效方法是什么MTLBuffer
?我还想尽可能有效地将MTLBuffer
缓冲区转换回CMSampleBuffer
缓冲区。
我是否需要先将音频转换CMSampleBuffer
为 NSData,然后使用makeBuffer(bytesNoCopy pointer: UnsafeMutableRawPointer, length: Int, ...)
?还是有更直接的方法?
ios - 创建后更改 MTLBuffer 的值
我希望能够定义一个 MTLBuffer 并将数据直接填充到缓冲区(或尽可能高效地)。
如果我执行以下操作,着色器中使用的值是 1.0 和 2.0(分别用于 X 和 Y),而不是在MTLBuffer
创建后设置的 3.0 和 4.0。
根据文档,我似乎需要调用didModifyRange:
但pointDataBuffer
似乎无法识别选择器。
有没有办法更新数组而不必重新创建 MTLBuffer?
xcode - Swift 3 / Xcode 9. MTLBuffer 'didModifyRange' 不可用
我试图告诉 MTLBuffer 范围已更改,但编译器不会让我这样做:
它只是说:“didModifyRange”不可用,为什么?
谢谢
c++ - 以一种非常奇怪的方式更新金属纹理
我正在尝试使用 Metal 编写蒙特卡洛路径跟踪器。我让整个管道(几乎)正常工作。我有一些奇怪的条带问题,但这似乎与我的路径跟踪逻辑有关,而不是与金属有关。
对于可能没有使用路径跟踪器经验的人来说,它的作用是从相机生成光线,在给定深度(在我的情况下为 8)的随机方向上围绕场景反弹,并且在每个交叉点/反弹时,它都会遮蔽射线与该材料的颜色。最终目标是通过一次又一次地平均多次迭代来“收敛”成一个非常漂亮和干净的图像。在我的代码中,我的金属计算管道一遍又一遍地运行,管道代表一个迭代。
我构建计算管道的方式是使用以下阶段:
生成光线
循环 8 次(即反弹光线 8 次):
1 - 计算光线交点并将其从该交点反弹(重新计算方向) 2 -
color
基于该交点“着色”光线通过获取当前纹理缓冲区的颜色,将其乘以
iteration
然后将光线的颜色添加到其中,然后除以 来获取所有迭代的平均值iteration+1
。然后将新的存储combined_color
在相同的确切缓冲区位置。
因此,在更高的层次上,我的整个Renderer
工作是:
1 - 在计算着色器中进行一堆光线计算 2 - 更新缓冲区(这是MTKView
的可绘制对象)
问题在于,由于某种原因,我的纹理在 3 个不同级别的颜色累积之间循环,并且在不同颜色之间不断出现故障,就好像有三个不同的程序试图写入同一个缓冲区一样。这不可能是由于竞争条件,因为我们正在从同一个缓冲区位置读取和写入,对吧?这怎么可能发生?
这是我前几次迭代的系统跟踪:
如您所见,在最初的几次迭代中,由于某种原因它不会渲染任何东西,而且速度非常快。我不知道为什么会这样。然后,迭代非常慢。这是第一部分的特写:
我试过每次只输出一个迭代的颜色,看起来非常好。我的图片没有收敛到干净的图像(这是多次迭代平均后发生的情况)
我尝试过使用信号量来同步事物,但我最终得到的只是一个停滞的程序,因为我一直在等待命令缓冲区,并且由于某种原因它永远不会准备好。我想我可能只是没有得到信号量。我试过查资料,我似乎做得对。
帮助..我已经在这个错误上工作了两天。我无法修复它。我什么都试过了。我只是不够了解,甚至无法开始辨别问题。这是该项目的链接。系统跟踪文件可以在System Traces/NaiveIntegrator.trace
. 我讨厌只粘贴我的代码,而且我知道 SO 不建议这样做,但问题是我只是不知道错误可能在哪里。我保证一旦问题得到解决,我将在此处粘贴相关的代码片段。
如果你运行代码,你会看到一个简单的康奈尔盒子,中间有一个黄色的球体。如果您让代码运行一段时间,您会看到循环中的第三个图像最终会收敛到一个像样的图像(忽略可能无关紧要的地板上的条带效应)。但问题是图像在 3 个不同的图像之间不断闪烁。
ios - Metal newBufferWithBytes 用法
我有一个关于分配新金属设备缓冲区的基本问题。我看到的大多数示例代码在设置时创建 MTLBuffer 并且不修改它。但我想知道顶点数据是否在每次渲染调用时都在变化,是否可以每次创建一个新的 MTLBuffer(使用 -[MTLBuffer newBufferWithBytes:length:option])来将数据发送到在 GPU 上运行的着色器,或者,应该 MTLBuffer给定大小创建一次,但每次渲染调用都会修改字节?根据最佳实践,推荐的方法是什么?
ios - MTLBuffer分配+CPU/GPU同步
我正在使用金属性能着色器(MPSImageHistogram
)来计算MTLBuffer
我抓取的东西,执行计算,然后通过MTKView
. 着色器的MTLBuffer
输出很小(~4K 字节)。所以我MTLBuffer
为每个渲染通道分配一个新对象,每个视频帧每秒至少有 30 个渲染。
我的问题-
每次使用都可以创建一个新缓冲区
device.makeBuffer(..)
,还是更好地静态分配几个缓冲区并实现重用这些缓冲区?如果重用更好,我们如何在这些缓冲区上同步 CPU/GPU 数据写入/读取?另一个不相关的问题,可以在
MTKView
非主线程上绘制结果吗?还是MTKView
只能在主线程中进行绘制(即使我读到 Metal 是真正的多线程)?
ios - 来自 MTLBuffer 问题的 MTLTexture
我将计算着色器的结果存储在 MTLBuffer 中。MTLBuffer 的每个元素都是一个 UInt16。我试图将结果传递给片段着色器,该着色器通过将 MTLBuffer 的元素解释为 0 到 255 之间的颜色强度来显示结果。我使用以下代码从这个 MTLBuffer 创建一个 MTLTexture 并将纹理传递给着色器。但我认为在这个过程中有些地方是不正确的,因为输出不正确。我不确定这是否是像素格式和/或格式转换的问题。
这是片段着色器代码,
swift - 收到错误消息“[CAMetalLayerDrawable texture] 不应在已经呈现此可绘制对象后调用。改为获取 nextDrawable。”
我只需要同时渲染多个对象。但我收到一个错误作为提及。在这里,我将多个对象传递给我的渲染函数。
其中render()
类如下
但我收到日志错误消息:
[CAMetalLayerDrawable 纹理] 不应在已呈现此可绘制对象后调用。取而代之的是 nextDrawable 。
有人有线索吗?
swift - 访问金属中的特定像素集 MTLTexture
我创建了一个MTLTexture
使用UIImage
数据,如下所示。
我需要做的是改变像素颜色MTLTexture
。不是所有的人。那么,是否可以MTLtexture
在 Metal 中访问一组特定的像素并写入其中?