草庐IT

ios - 找不到 Metal iOS 的资源

关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭2年前。Improvethisquestion我正在尝试学习用于iOS3D开发的Metal。我在网上看了看,有几篇短文只涵盖了Metal的基础知识。还有一本书“Metalbyexample”,但是这本书也没有详细介绍Metal。我还检查了在堆栈溢出时提出的类似问题,但答案只是让我看到相同的文章。有谁知道可以教我从基础知识一直到Metal专家水平的好资源(书籍、视频或网络教程)?

120 fps 的 iOS Metal 双缓冲

有没有办法在120Hz(ProMotion)下获得双缓冲而不是三重缓冲?我正在尝试最大程度地减少UI延迟。当我使用Xcode的iOS游戏模板(它呈现一个旋转的立方体)时,尽管工作量很小,但我仍然在120hz下获得三重缓冲。它在60hz下进行双缓冲。重现:使用File→New→Project在Xcode中创建一个新项目选择iOS→游戏选择Swift/Metal在GameViewController中添加mtkView.preferredFramesPerSecond=120产品→简介选择Metal系统跟踪观察:三重缓冲(帧有3种颜色):看图,GPU似乎在双缓冲所需的时间内完成得很好。这里

iOS Metal : How to Capture GPU Frame properly?

我正在尝试通过捕获GPU帧来分析Metal内核。在具有Metalrunloop的应用程序中,我会单击调试区域中的“相机按钮”,但是我在每个应用程序生命周期中只分派(dispatch)一次内核,因此我无法单击“相机按钮”(它保持灰色)。因此,我尝试通过在第一次调用mQueue.insertDebugCaptureBoundary()之前设置断点和“捕获GPU帧”操作来解决这个问题(参见下面的代码)。我希望发生的事情类似于this–即每个内核函数的执行持续时间概览,其中标明了执行各行内核函数所花费的时间百分比。实际发生的情况是:我很少得到所描述的预期分析概述。大多数时候(大约95%的时间)

ios - Metal 纹理格式

我在Swift中声明了一个Metal纹理,格式为.bgra8Unorm。现在在Metal计算kernel中,我使用half数据类型访问它(我相信Apple示例就是这样做的)。texture2dinTexture[[texture(0)]]是否会以这种方式(通过采样器)访问bgra8Unorm纹理和/或将其写回自动将half值打包和解包为8位整数?当我向纹理写入一个负的half值时会发生什么? 最佳答案 Yes.当写入具有规范化无符号整数分量的纹理时,值被有效地限制在[0,1],然后按格式的最大值(在本例中为255)缩放。

ios - 解决奇怪的行为 re : glsl/metal shader.(无意的坐标翻转)

我已经将这个着色器从shadertoy移植到适用于iOS的Metal着色器中。原来的工作正常,但现在我已经将它移至iOS,我得到了一些奇怪的行为。基本上,在着色器运行的前几秒,一切都错位了。我认为这是因为X轴上存在镜像,这是正确的,但垂直坐标也以某种方式在一侧翻转。谁能告诉我应该如何解决这个问题?原始Shadertoy:https://www.shadertoy.com/view/ltl3Dj我的版本,转换成Metal着色语言:#includeusingnamespacemetal;///////////////////CSBCONSTANTS(notrequired,justmake

ios - Metal :iPhone 5/iOS 8 上的 "Failed creating a default system device!"

当我在iPhone5/iOS8上运行Metal示例项目时,它们在这里失败:m_Device=MTLCreateSystemDefaultDevice();if(!m_Device){NSLog(@">>ERROR:Failedcreatingadefaultsystemdevice!");returnNO;}MTLCreateSystemDefaultDevice()返回id0x0而不是有效的id.还有人遇到这个问题吗? 最佳答案 Metal仅适用于A7设备。 关于ios-Metal:i

ios - 在 Metal 中填充 float 缓冲区

问题:我需要填写一个MTLBuffer的Floats有一个常数值——比如说1729.68921.我还需要它尽可能快。因此我被禁止在CPU端填充缓冲区(即从UnsafeMutablePointer获取MTLBuffer并以串行方式分配)。我的方法理想情况下,我会使用MTLBlitCommandEncoder.fill(),但是AFAIK它只能用UInt8填充缓冲区值(假设UInt8是1个字节长,Float是4个字节长,我不能指定我的Float常量的任意值)。到目前为止,我只能看到2个选项,但两个选项似乎都过大了:创建另一个缓冲区B填充常量值并通过MTLBlitCommandEncoder

ios - 如何使用 Metal 清除 GPU 纹理?

我有一个只能由GPU访问的3D纹理,我试图在帧开始时清除它。我已经尝试使用计算机着色器将每个元素设置为零,但对于64x64x64纹理,这将花费近3毫秒,我想使用比这更大的东西。如果我可以对颜色附件执行类似加载时清除操作的操作,那就太好了,但我认为在这种情况下这是不可能的。清除纹理最快的方法是什么? 最佳答案 最简单的方法是使用renderPassDesciptor的loadActions,如下所示:MTLRenderPassDescriptor*rpdesc=[MTLRenderPassDescriptorrenderPassDes

ios - 如何使用 Metal 绘制圆弧?

我浏览了一些关于iOSMetalAPI的教程,他们提到Metal中的所有东西都是三角形。那么,如果我想画一个圆弧,我是否必须导入核心图形并使用它,或者是否有如何使用Metal做到这一点?谢谢。 最佳答案 GPU(除了一些极少数异常(exception))专门处理三角形。正方形只是两个相互对接的三角形。一个圆圈就是一组呈扇形排列的小三角形。每个形状都是由许多以适当模式排列的小三角形组成的。Metal以低级方式与GPU通信,因此现在您的工作是根据三角形组来表达形状。 关于ios-如何使用Me

ios - Metal 渲染真的很慢 - 如何加快速度

我有一个运行速度非常慢的Metal应用程序,需要运行得更快。我相信问题是我创建了太多MTLCommandBuffer对象。我创建这么多MTLCommandBuffer对象的原因是我需要向像素着色器发送不同的统一值。我粘贴了一段代码来说明下面的问题。for(intobj_i=0;obj_imtlCommandBuffer=[metal_info.g_commandQueuecommandBuffer];idrenderCommand=[mtlCommandBufferrenderCommandEncoderWithDescriptor:]//glossingoverdetails,but