草庐IT

ios - MTKTextureLoader 使图像饱和

我正在尝试使用MTKTextureLoader将CGImage作为纹理加载。这是原图但是在我将该CGImage转换为MTLTexture并将该纹理转换回CGImage之后,它看起来很糟糕,如下所示:这是代码中发生的事情。图像作为CGImage加载(我已经检查过,该图像确实具有完整的视觉质量)我有一个函数view()允许我通过在CALayer中使用它来查看NSImage,如下所示:funcview(){.....imageView!.layer=CALayer()imageView!.layer!.contentsGravity=kCAGravityResizeAspectFillima

ios - Swift Metal MTLCreateSystemDefaultDevice 返回 nil

我尝试在MetaliOS上开发一些东西并收到以下错误:代码:letdevice=MTLCreateSystemDefaultDevice()!错误:Thread1:Fatalerror:UnexpectedlyfoundnilwhileunwrappinganOptionalvalue我在xcode9.4.1iOSSDK:11.4架构:arm64armv7armv7s有人可以帮忙吗 最佳答案 在真实设备iPhone或iPad上测试它,它不会在模拟器上运行。 关于ios-SwiftMeta

swift - Metal 中的混合模式

这是我在OpenGL中使用的两种混合模式什么是IOS中的Metal转换glEnable(GL_BLEND);glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA);glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE,GL_SRC_ALPHA,GL_ONE); 最佳答案 您在渲染管道描述符上配置混合。我相信您的GL代码的等效配置是://glEnable(GL_BLEND)renderPipe

swift - Metal 内核在新款 MacBook Pro(2016 年末)GPU 上无法正常运行

我正在研究使用Swift和Metal在GPU上进行图像处理的macOS项目。上周,我收到了我的新15英寸MacBookPro(2016年末)并注意到我的代码有些奇怪:应该写入纹理的内核似乎没有这样做......经过大量挖掘,我发现问题与Metal(AMDRadeonPro455或Intel(R)HDGraphics530)使用哪个GPU进行计算有关。使用MTLCopyAllDevices()初始化MTLDevice返回代表Radeon和IntelGPU的设备数组(而MTLCreateSystemDefaultDevice()返回默认设备是Radeon)。在任何情况下,代码在IntelG

swift - 如何使用 UnsafeMutableRawPointer 填充数组?

我有一个Metal纹理,我想通过将其设为float4数组来从Swift访问它的数据(这样我就可以访问每个像素的4个颜色分量)。我发现了MTLTexture的这个方法:getBytes(UnsafeMutableRawPointer,bytesPerRow:Int,bytesPerImage:Int,from:MTLRegion,mipmapLevel:Int,slice:Int)我完全不知道如何使用UnsafeMutableRawPointer,它是如何工作的,以及如何将数据返回到一个简单的Swift数组中。我的第一次尝试是创建一个指针并分配足够的空间,但我什至不知道我是否应该这样做:

ios - 如何为溶解效果编写 sceneKit 着色器修改器

我想为Scenekit游戏构建溶解效果。我一直在研究着色器修改器,因为它们似乎是最轻量级的,并且没有运气复制这种效果:是否可以使用着色器修改器来创建这种效果?你将如何实现一个? 最佳答案 您可以使用片段着色器修改器获得非常接近预期的效果。基本方法如下:噪声纹理样本如果噪声样本低于某个阈值(我称之为“揭示”),则将其丢弃,使其完全透明否则,如果片段靠近边缘,请将其颜色替换为您喜欢的边缘颜色(或渐变)应用光晕使边缘发光这是执行此操作的着色器修改器代码:#pragmaargumentsfloatrevealage;texture2dnoi

ios - 有效地将 Swift 数组复制到 iOS Metal 的内存缓冲区

我正在使用Apple的新Metal框架编写一个iOS应用程序。我有一个Matrix4对象数组(参见RayWenderlich'stutorial),我需要通过MTLDevice.newBufferWithLength()方法将其传递给着色器。Matrix4对象利用了Apple的GLKit(它包含一个GLKMatrix4对象)。我正在利用GPU调用的实例化。我稍后会将其更改为每个实例包含更多数据的结构(不仅仅是Matrix4对象。如何有效地将[Matrix4]对象数组复制到此缓冲区中?有更好的方法吗?同样,我将在未来扩展它以使用包含更多数据的结构。下面是我的代码的一个子集:letsize

ios - 我可以使用 Metal 在 GPU 上运行算法吗?

我使用最小编辑距离算法来确定两个字符串的相关程度。我已经将它实现为在CPU上运行,并且当您有数百个字符串时它工作得很好,但是当您多次比较数千个字符串时它会降低速度。所以我认为将负载卸载到GPU上可能会有用,因为它可以一次执行多个比较。这可能吗?我遇到的Metal资源主要用于没有帮助的图形。或者他们可能是? 最佳答案 您想要做的事情是可能的,至少对于某些问题规模而言是这样,但这并不是特别简单。您需要做的是以一种可以在GPU和iOS上运行的方式表达算法,这可能意味着使用Metal。具体来说,您需要使用实现最小编辑距离算法的Metal着色

ios - MTKView显示宽色域P3色彩空间

我正在构建基于CIFilters和MetalKit的实时照片编辑器。但是我在MTKView中显示宽色域图像时遇到了一个问题。标准sRGB图像显示效果很好,但是显示P3图像被冲洗掉了。我尝试将CIContext.render色彩空间设置为图像色彩空间,但仍然遇到问题。以下是代码片段:guardletinputImage=CIImage(mtlTexture:sourceTexture!)else{return}letoutputImage=imageEditor.processImage(inputImage)print(colorSpace)context.render(outputI

swift - 如何在 SceneKit 中的 "own"轴上移动旋转的 SCNNode?

下图显示了一个旋转的盒子,它应该在X轴和Z轴上水平移动。Y应该保持不受影响以简化场景。盒子也可能是相机的SCNNode,所以我猜此时投影没有意义。假设我们要将框沿红色箭头的方向移动。如何使用SceneKit实现这一点?红色箭头表示盒子的-Z方向。它还向我们展示了它不平行于相机的投影或显示为网格的深灰色线的全局轴。我的最后一种方法是平移矩阵和旋转矩阵的乘积,它会产生一个新的变换矩阵。我是否必须将当前转换添加到新转换中?如果是,用于相加矩阵(如用于乘法的SCNMatrix4Mult)的SceneKit函数在哪里,还是我必须使用Metal自己编写?如果不是,我在矩阵计算中遗漏了什么?我不想使