问题标签 [metal]
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 - 在 iOS metal 中重用具有不同统一参数的像素着色器
我在具有不同统一参数的不同对象上重用我的金属像素和顶点着色器时遇到问题。我猜这与我错误地使用命令缓冲区有关。
当我运行我的金属应用程序时,几何图形正确绘制,但只有制服用于最终调用
renderCommand setFragmentBuffer:uniform_info offset:0 atIndex:UNIFORM_INFO_BUFFER_INDEX];
似乎将数据写入像素着色器。
我在这里剪切并粘贴(并编辑了)我的渲染循环。我正在寻找一个示例,说明如何在传入不同制服的单个渲染过程中多次重复使用我的像素着色器。
如果你愿意,我也可以发布像素着色器,但是当我编码为一次只渲染一个对象时,着色器可以正常工作。
ios - 金属渲染真的很慢 - 如何加快速度
我有一个运行速度极慢的金属应用程序,需要运行得更快。我相信问题是我创建了太多的 MTLCommandBuffer 对象。
我创建这么多 MTLCommandBuffer 对象的原因是我需要向像素着色器发送不同的统一值。我粘贴了一段代码来说明下面的问题。
上面的代码按预期绘制,但速度非常慢。我猜是因为有比为每个对象创建一个 MTLCommandBuffer 更好的方法来强制像素着色器评估。
我考虑过简单地分配一个比单个着色器传递所需的缓冲区大得多的缓冲区,并简单地使用偏移量在一个渲染命令编码器中将多个调用排队,然后执行它们。这种方法看起来很不正统,我想确保我正在解决需要以金属友好的方式发送每个对象的自定义数据的问题。
使用每次调用自定义统一数据使用同一像素/顶点着色器的多个通道进行渲染的最快方法是什么?
ios - iOS 金属资源 - 在哪里可以找到
我目前正在使用Metal编写一个大型 iOS 8 应用程序。由于缺乏重要的示例,事实证明它非常令人沮丧,而且事实(按设计)与 DirectX 和 OpenGL ES(我都知道)有点不同。
目前,我只能找到使用单个顶点/索引缓冲区然后在着色器中做一些花哨的东西的教程。我想看看如何管理具有不同顶点和着色器制服的多个对象绘制同一帧。
ios - iOS 8.3 Metal 停止和崩溃
在 Xcode 和设备上升级到 iOS 8.3 SDK 后。我的涉及金属的应用程序无法正常工作。Metal 用于 obj 文件可视化和 GPU 计算。我的应用程序停止了几秒钟然后崩溃了。我注意到在 Xcode 控制台中显示“Metal GPU Frame Capture Enabled”,之前没有出现。这是造成的问题吗?如果是这样,是否有在 iOS 8.3 中关闭此功能?
ios - iOS Metal 计算管道比搜索任务的 CPU 实现慢
我做了一个简单的实验,通过实现简单的字符搜索算法在 CPU 和 GPU 上搜索 1.000.000 行,每行 50 个字符(50 百万字符映射)(使用 iOS8 Metal 计算管道)。
CPU 实现使用简单的循环,Metal 实现给每个内核 1 行来处理(下面的源代码)。
令我惊讶的是,Metal 实现平均比简单的线性 CPU(如果我使用 1 个内核)慢 2-3 倍,如果我使用 2 个内核(每个内核搜索一半数据库)则慢 3-4 倍!我尝试了每组不同的线程(16、32、64、128、512),但仍然得到非常相似的结果。
iPhone 6:
我可以看到金属着色器花费了超过 90% 的访问内存(见下文)。
可以做些什么来优化它?
任何见解都将不胜感激,因为互联网上没有很多资源(除了标准的 Apple 编程指南),提供有关 Metal 框架特定的内存访问内部和权衡的详细信息。
金属实现细节:
主机代码要点: https ://gist.github.com/lukaszmargielewski/0a3b16d4661dd7d7e00d
内核(着色器)代码: https ://gist.github.com/lukaszmargielewski/6b64d06d2d106d110126
GPU 帧捕获分析结果:
ios - newBufferWithBytes() 有大小限制吗?
我一直在使用 Metal 渲染多面体。当我尝试使用 newBufferWithBytes() 渲染一个二十面体实体时,就会出现问题,该实体的顶点仅包含大小为 1680 字节的数据。然后整个应用程序停止,CPU 和 GPU 帧都下降到零,一切都恢复正常,除了金属视图冻结。
我在实现中将常规多面体作为 Node 的子类。
opengl - 将 OpenGL 应用程序移植到 Metal API
在 OpenGL 中我得到了这个(缩短的代码)
上面的代码在我的引擎中运行良好。但是当我决定将它移植到 Metal API 时,我遇到了一些问题——它只使用索引数据渲染模型的一半,它的网格中没有组,它只是简单的网格。但是当我尝试使用顶点数据( drawPrimitives )渲染它时,它渲染得很好。
这是我用来初始化和渲染我的网格的金属代码:
ios - 如何在 Metal 的片段着色器中获取片段坐标?
这个最小的金属着色器对根据顶点的颜色属性在屏幕上渲染一个简单的插值渐变(当提供顶点四边形/三角形时):
…具有以下顶点:
到现在为止还挺好。它呈现众所周知的渐变三角形/四边形。
您几乎可以在每个 GPU HelloWorld 教程中找到它。
然而,我需要一个片段着色器,而不是采用插值顶点颜色来计算基于屏幕上片段位置的颜色。它接收一个填充屏幕的四边形顶点,然后仅使用片段着色器来计算实际颜色。
据我了解,顶点的位置是 a float4
,前三个元素是 3d 向量,第四个元素设置为1.0
。
所以——我想——应该很容易修改上面的内容,让它简单地将顶点的位置重新解释为片段着色器中的颜色,对吧?
…具有以下顶点:
然而,我很惊讶地发现正在渲染一个统一颜色(黄色)的屏幕,而不是从x 轴red=0.0
到x 轴的渐变:red=1.0
green=0.0
green=1.0
interpolated.position
似乎为每个片段产生相同的值。
我在这里做错了什么?
Ps:(虽然这个虚拟片段逻辑可以很容易地使用顶点插值来完成,但我的实际片段逻辑却不能。)
swift - 在 SceneKit 中使用金属着色器
我想使用Metal
着色器将卡通/单元格着色应用于场景中使用的材质。我试图实现的着色器是 AppleAAPLCelShader
在MetalShaderShowcase中找到的。我对实现着色器有点陌生,SceneKit
所以我可能做的一切都完全错误。
根据我在文档中的理解,aMetal
或 GL 着色器可用于修改SceneKit
iOS 9 和 Xcode 7 的渲染。文档建议这与 GL 着色器的方式相同。
我的方法是尝试获取.metal
文件的路径,然后将其加载到一个字符串中SCNMaterial
shaderModifiers
,以 [String: String] 字典的形式在属性中使用,就像使用 GL 着色器一样(尽管我还没有使其正常工作)。
我的代码是:
这是在一个测试场景上运行的,其中有一个从.scn
文件加载的盒子几何图形。文件加载工作正常,所以这不是问题。
错误来自我尝试查找路径的第二行,它给了我“在展开可选值时找到 nil”,这是强制展开时预期的,除了它尝试加载的文件是大多数当然在捆绑包中,相同的代码适用于其他文件类型,但不是.metal
。
我会以完全错误的方式解决这个问题吗?除了我滥用金属文件的问题外,我不明白为什么它不会访问该文件。
有没有更简单或更好的方法来实现单元格着色并最终在边缘上加粗轮廓?
swift - 使用 SceneKit 快速实现数学可移动网格
我是一名想要编写几何游戏的数学家。
我有我需要显示的几个网格及其单位法线的精确坐标和数学公式。
每个网格只需要一个纹理(彩色反射金属)。
我需要让用户移动块,即改变网格的坐标,再次通过一个简单的数学公式。
所以我不需要导入 3D 文件,而是可以计算所有内容。
想象一种魔方。立方体坐标被计算出来,立方体由用户旋转。我有在 Mathematica 中运行的程序。
我现在非常难熬,不眠不休,试图准确地找到如何在 SceneKit 中显示计算网格 - 每个顶点和法线分别动画。
任何工作示例,例如,具有计算坐标的单个三角形(而不是库存提供的形状),由 SceneKit 以动画坐标显示,将受到极大的赞赏。
我看了更多,似乎网格的各个点在 SceneKit 中可能无法移动。我喜欢 SceneKit(与 OpenGL 不同)的功能,即可以在用户手指下获取对象。可以在一个项目中混合使用 OpenGL 和 SceneKit 吗?
我可以从那里接管......