问题标签 [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 投票
1 回答
183 浏览

swift - 通过金属中的任意 (x,y) 点围绕 z 轴旋转

我有一个有四个顶点的平面。它可以绕z轴(0, 0,1)旋转。(实现在金属中使用模型矩阵)。模型矩阵根据旋转手势进行更改。

所以我需要做的是通过任意(x,y)围绕z轴旋转平面,其中x,y不等于零。这意味着围绕垂直于xy平面的轴旋转平面并通过(x,y)观点。

请问有什么建议吗?

0 投票
0 回答
171 浏览

swift - 在 Metal IOS 中一次性发送 SetFragment 纹理

我正在绘制四边形并在我的手指在屏幕上触摸的地方附加纹理。我使用的纹理是相同的。但在手指触摸一段时间后,FPS 下降到 5 到 10。如果我调试

在此处输入图像描述

我们可以在图像中看到 setFragmentTexture 命令每次都在运行。同样的事情在重复。

如何优化以便我可以使用纹理优化方式。只有一次我需要将纹理发送到 GPU 并在将来使用该纹理

0 投票
0 回答
193 浏览

swift4 - MTKView 纹理正确的颜色堆积

我正在开发一个金属支持的绘图应用程序,其中笔触是通过沿路径反复压印纹理正方形在 MTKView 上绘制的。我遇到了颜色累积问题,如下图所示:

冲压实施的快照

对于 alpha 值 [0.5 - 1.0],结果或多或少符合我的预期。但是,对于较小的 alpha 值,结果看起来不完整,并且永远无法达到原始完全不透明画笔颜色的均匀/正确饱和值(即,如上图中的顶部笔触)。

我的方法的一个关键概念是以下(可能有缺陷的)实现:比如说,所需的画笔颜色是蓝色,如上:

我设置每个 stampColor 的方式是通过将 BrushColor 除以重叠图章的数量:

.

这个想法是 n 个重叠的图章将累积加起来为画笔颜色(蓝色)。每个图章在每个顶点使用此 stampColor 将圆形斑点的白色纹理与 alpha 设置相乘。下面是我的片段着色器:

.

因此,基于这个概念,我着手寻找一种混合模式,可以给我想要的结果。经过反复试验,我得出了以下混合设置,以达到上图的效果:

.

在一个相关的帖子中,有人建议我使用“Source Over Compositing”

cdst′ = αsrc * csrc + (1 - αsrc) * cdst

...翻译为:

.

但结果与预期的结果相去甚远。

我正在使用的纹理是从 png 文件(具有透明度)构建的,如下所示:

.

总而言之,我的问题是,我如何设置我的纹理/混合模式,对于任何印章透明度值,在一个区域中绘制的累积结果最终会导致全色不透明度?任何指针将不胜感激。

0 投票
1 回答
387 浏览

swift4 - 在 draw() 循环中重新使用 currentDrawable.texture 时的 MTKView 混合问题

我正在开发一个金属支持的绘画应用程序,在该应用程序中,我将笔画的绘制分为两个步骤:第一步将笔画的前沿绘制到屏幕上,并通过以下方式将整个捕获到 MTLTexture:

第二步绘制前进笔划的更新前边缘,并在使用最后保存的 metalTextureComposite 纹理的多边形上进行合成。

这种方法允许我在不牺牲性能的情况下绘制无限长的笔划,因为这两个步骤在绘制周期的每一帧中都重复。

我遇到的问题是,使用所需的源复合模式(见下面的代码),我只看到笔划的前沿被绘制到屏幕上。这告诉我要么我没有从 currentDrawable 充分捕获 metalTextureComposite,要么我对要使用的混合模式做出了错误的假设,顺便说一下如下:

如果我使用不同的混合模式,我会看到整个笔画被绘制,但不一定是我想要的外观。下面是我包含在 MTKView 的 draw() 方法中的部分代码。

我是否应该以不同的方式处理 metalTextureComposite(因为它是以 1/fps 写入的),如果是这样,我应该如何处理它?目标是为背景多边形和前导笔划多边形使用单一混合模式。任何帮助,将不胜感激。

0 投票
2 回答
881 浏览

swift - 如何使用 rgba16Float MTLPixelFormat 显示 MTKView

我有一个 MTKView 设置为使用 MTLPixelFormat.rgba16Float。我遇到了显示问题,下图可以很好地描述这些问题:

在此处输入图像描述

因此,预期的 UIColor 会被淘汰,但仅在它显示在 MTKView 中时。当我通过 CIIMage 将可绘制纹理转换回图像以在 UIView 中显示时,我恢复了原始颜色。这是我创建该输出的方式:

其他相关设置:

一些帖子暗示 sRGB 被假定在某处,但没有具体说明如何禁用它。

我希望我在 MTKView 上显示的颜色与输入相匹配(无论如何都尽可能接近它),并且仍然能够将该纹理转换为我可以在 ImageView 中显示的东西。我已经在 iPad Air 和新的 iPad Pro 上对此进行了测试。相同的行为。任何帮助,将不胜感激。

0 投票
1 回答
95 浏览

ios - 当应用程序被带到前台时,是否需要重新创建 MTLBuffer、MTLTexture 或其他金属资源?

我正在重构 cocos2d-x 的渲染层,新引擎将使用 Metal on iOS. 在原始版本中,cocos2dx 会在应用程序在后台长时间停留后被带到前台时重新创建所有缓冲区和纹理。

我是 Metal 的新手,我的问题是:是否有必要将 MTLBuffer、MTLTexture 和其他 Metal 资源重新创建为 GLES?

0 投票
1 回答
179 浏览

ios - 绘制 MTLBuffer 的一部分?

我正在使用此调用从缓冲区渲染点片段:

emitter.currentParticles是缓冲区中的粒子总数。是否可以以某种方式仅绘制缓冲区的一部分?

我试过这个,但它绘制了缓冲区的前半部分:

事实上,似乎vertexStart没有任何效果。我似乎可以将它设置为任何值,它仍然从 0 开始。

编辑:

管道配置:

顶点着色器:

0 投票
1 回答
502 浏览

ios - MTLBuffer 与 MTLStorageModePrivate 模式

我对金属比较陌生,我有一个非常直截了当的问题。我根本无法MTLBuffer使用MTLStorageModePrivate选项进行初始化:

编译器给我一个带有该文本的断言:

这没有多大意义。我正在创建一个只能从 GPU 访问的缓冲区,因此对于这个特定实体,我不需要任何 cpu 缓存模式。我想我需要关闭那个 cpu 缓存模式,但是怎么做呢?

我查看了MTLCPUCacheMode,但它与完全关闭 cpu 缓存模式无关。

有趣的说明:我绝对可以MTLHeap用创造MTLStorageModePrivate,但不能MTLBuffer

任何帮助,将不胜感激。提前致谢!

更新:我可以MTLBuffer使用MTLStorageModePrivate. MTLHeap它看起来像这样:

但是没有堆仍然是不可能的。

0 投票
1 回答
77 浏览

swift - 为什么这个金属代码不能产生正确的三角形几何?

我正在关注 Metal By Example 的 Metal 教程,并将代码转换为 Swift。

我正在运行第二个示例,由于某种原因,此代码不起作用。

我很确定着色器不是问题,因为顶点着色器只是接收顶点缓冲区并返回顶点。

片段着色器只获取顶点着色器的输出和返回颜色。

视图控制器是默认的——没有碰过它。

我将控制器视图的类更改为这个 MBEMetalView 类。

我确实偶然发现了使用顶点指针、长度和“storageModeShared”选项创建顶点缓冲区的代码行出错。

最初,我将长度 = 设置为 MemoryLayout.size(of: vertices) 但根据控制台消息,当缓冲区需要长度为 32 时,仅创建长度为 8。

我只是增加了长度,错误就消失了......

但是,三角形是扭曲的,而不是正确的颜色。看起来前 2 个顶点的位置正确,但第三个顶点没有。

没有一个颜色是正确的。有任何想法吗?

当我更改缓冲区的长度时 - 三角形将改变形状或从屏幕上消失。

0 投票
1 回答
438 浏览

cocoa - 如何设置从 MTLBuffer 到 2D MTLTexture 的字节对齐?

我有一个浮点值数组,代表我最终想要渲染为MTLView. 这是在 macOS 上,但我希望能够在某个时候将其应用于 iOS。我最初用数据创建一个MTLBuffer

从这里开始,我通过几个计算管道运行缓冲区。接下来,我想创建一个 RGBMTLTexture对象以传递给几个CIFilter/MPS 过滤器,然后显示。创建一个使用已经创建的缓冲区作为支持以避免制作另一个副本的纹理似乎是有意义的。(我已经成功地使用了像素格式的纹理MTLPixelFormatR32Float。)

图像尺寸为 242x242。当我运行它时,我得到:

我知道我需要使用:

如何定义缓冲区以使字节正确对齐?

更一般地说,这是处理这类数据的合适方法吗?这是我有效地将浮点数据转换为有颜色的东西的阶段。为了澄清,这是我的下一步:

其中intermediateRGBTexture是定义MTLPixelFormatRGBA16Float为利用 EDR 的 2D 纹理。