问题标签 [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.
objective-c - 导致未定义行为的 Swift 结构
我正在编写一个使用 Metal 的程序。我正在使用结构定义统一缓冲区布局。当我在 swift 中声明结构时,它无法绘制。但是当我在 Objective-C 中声明结构并使用桥接头导入它时,它工作正常。计算的实际逻辑完全相同。唯一的变化是声明。以下是声明:
Objective-C 声明(这个有效):
以及 Swift 声明:
请注意,数学类型是在 Objective-C 中定义的结构,并充当 Swift 的包装器。
有关更多信息,这里是计算值并将它们发送到 Metal 的 Swift 代码:
对不起所有的代码,但请帮忙。谢谢。
ios - 错误:符号“xxx”被多重定义
我在代码中添加了多个金属着色器,现在得到:
我没有.metal
在任何地方包含文件(XCode 负责编译本身)并且我无法添加inline
或添加static
到函数中,所以出了什么问题?
ios - 金属着色器代码在什么情况下会“崩溃”?
我正在开发一个基于 Metal 的应用程序,在某些情况下,正确编译和链接的着色器代码会导致应用程序简单地崩溃而不会引发任何错误。
“崩溃”包括视觉输出的停止(在某些情况下,之前是几个交替帧的短暂停顿),但其他应用程序的其余部分正常运行。Xcode 性能监控实用程序报告 60fps 但 GPU 延迟为 0ms,并且 CPU 端执行继续,对 Metal API 的调用仍然成功完成。
不会向控制台报告任何错误。
这非常难以调试,因为我不知道错误来自着色器代码的何处。如果我知道这实际上应该在什么条件下发生,那将会有所帮助,这样我就可以有一个很好的清单来检查。否则,每当出现这种情况时,我都会在黑暗中拍摄。
3d - 与实例化渲染相关的开销是多少?
我正在构建一个大量使用实例渲染的渲染系统。据我了解,实例化渲染通常更有效,因为它可以减少总绘制调用和必须存储在 GPU 上的原始顶点数据量。
我希望,在某些时候,与简单地发送原始顶点数据相比,实例化渲染会产生开销。我当前的绘图系统将导致许多实例(数千个)非常小的顶点数据(每个 6 个顶点)。
实例化渲染非常适合我的绘图系统,并允许我避免生成任何“冗余”顶点数据,但我担心绘制这么多微小的实例会给 GPU 带来额外的压力。是这样吗?
ios - 金属有后缓冲吗?
我目前正在跟踪我的 Metal 应用程序中的一些视觉弹出,并相信这是因为我直接绘制到帧缓冲区,而不是后台缓冲区
几次谷歌搜索后,我还没有找到任何关于金属后备缓冲区的文档。我知道我可以自己滚动,但我不敢相信金属不支持后缓冲。
这是我如何设置 CAMetalLayer 对象的代码片段。
我可以在我的 CAMetalLayer 对象上启用后缓冲区,还是需要自己滚动?
swift - 金属中的 ASTC 纹理压缩——我应该使用什么作为每行的字节数?
我正在编写一个在 Metal 中使用压缩纹理的程序。我在使用replaceRegion()
MTLTexture 的功能时遇到了一些麻烦。该参数bytesPerRow
似乎没有意义。它表示对于压缩纹理,“bytesPerRow
是从一行块的开头到下一行块的开头的字节数。”
现在我使用 ASTC 和 4x4 块,这意味着我有 8 bpp。那么 4*4 就是 16,8 位就是一个字节。所以我猜测每个块大小是 16 字节。但是,当我输入 16 时,我得到一个失败的断言,要求最小值为 4096。这是怎么回事?
非常感谢你。
ios - texturecube 和 texture3d 的区别
如果我想存储立方体积的信息,如果我使用两者中的任何一个,是否有任何速度/内存优势?
ios - 计算着色器的动态输出
如果我在计算着色器中生成 0-12 个三角形,有没有办法可以将它们流式传输到缓冲区,然后用于渲染到屏幕?
我目前的策略是:
- 创建一个
float3
大小为 的缓冲区threads * 12
,因此可以存储最大可能数量的三角形; - 使用取决于网格中线程位置的索引写入缓冲区,因此没有竞争条件。
但是,如果我想从中进行渲染,则需要跳过empty memory。听起来很难看,但目前可能没有其他方法。我知道 CUDA 几何着色器可以具有可变长度输出,但我想知道 iOS 上的游戏是否/如何在 GPU 上生成可变长度数据。
更新 1:
写完问题后,我就想到了使用第二个缓冲区的可能性,该缓冲区会指出每个块有多少个三角形可用。然后顶点着色器将处理该块的所有三角形的所有顶点。
虽然这并不能解决未使用内存的问题,而且由于我有大量线程,所以浪费的总内存将是相当可观的。
ios - 为什么 GPU 帧捕获不适用于 Metal?
当我单击相机按钮来捕获和调试 GPU 时,它只是禁用了按钮,没有其他任何反应。然后当我从 XCode停止应用程序时,视图(令人困惑地)切换到助手编辑器,两个视图中都有源代码。
此外,我注意到调试面板中的 FPS 保持为零,而我可以看到从金属着色器渲染的视频。
如果我运行一个新的示例应用程序,GPU 调试工作正常,我可以看到 FPS 为 60。有人知道它可能是什么吗?
使用 Xcode 6.4 和 iPhone 6。
ios - 在 Metal 中将数据加载到 3D 纹理中
根据我阅读文档的理解,3D 纹理只有 1 个切片。但是,当我尝试将数据加载到其中时,它会失败并出现错误:
用于加载的代码是(纹理是类型MTLPixelFormatRG16Uint
和大小elementsInRow * elementsInRow * elementsInRow
):
其中elementsInRow
是128
,区域是MTLRegion region = MTLRegionMake3D(50, 50, 50, 4, 4, 4);
,数据是uint16_t data[region.size.depth][region.size.height][region.size.width][2]
。
我也尝试过:
但它会导致内存错误。
另请参阅:https ://forums.developer.apple.com/message/43332#43332
如何正确加载 3D 纹理的 3D 区域中的数据?
更新 1:
第二个示例在区域具有深度1
甚至更大width
并且height
(但32x32x1
会崩溃)时有效。
更新 2:
如果我16x16x1
为区域中的每个像素使用并写入相同的值,它似乎可以工作,但是当我将数据导出为图像时,看起来正在写入随机数据,请参阅图像的缩放部分:
如果我再次运行测试,图像将具有相同颜色的相同顶部,但其余点会改变强度。请注意,我正在为每个像素写入相同的值,因此该区域应该是统一的颜色。