【问题标题】:change CAMetalLayer background color更改 CAMetalLayer 背景颜色
【发布时间】:2016-10-24 11:31:30
【问题描述】:

我的CAMetalLayer 背景颜色是黑色,即使我将新颜色指定为backgroundColor 属性。

我错过了什么吗?谢谢!

链接到原始项目:

https://github.com/audiokit/MetalParticles

【问题讨论】:

  • 您可以添加代码以更好地了解发生了什么
  • 如果你正在做任何渲染,你还需要在你的渲染通道描述符的主颜色附件上设置一个清晰的颜色。比如:renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(1, 1, 1, 1); renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear;
  • 嘿@warrenm !据我所知,它使用计算而不是渲染。我对代码几乎迷失了。为了您的方便,我附上了原始项目!
  • @AdnanAftab 更新了项目
  • @warrenm 更新了项目

标签: objective-c swift colors background metal


【解决方案1】:

我发现层需要self.isOpaque = false

【讨论】:

    【解决方案2】:

    该项目采用了一种非常规的方法来清除每帧可绘制对象的纹理:它将纹理内容替换为与纹理大小相同的零数组(宽度 * 高度 * 4)。随后,它对一些实际绘制粒子的计算工作进行编码。这几乎肯定不是实现此效果的最有效方法,但如果您想做出可能起作用的最小更改(而不是尝试使代码尽可能高效),只需将 blankBitmapRawData 数组填充为您想要的清晰颜色(ParticleLab.swift 的第 82 行附近)。

    【讨论】:

    • 嘿沃伦。你总是那么耐心和真棒导师!我试图了解如何实现这一点,blankBitmapRawData 期望 [UInt8]。我尝试分配它[1,1,1,1](RGBA)。但它不起作用。你能指导我如何为 blankBitmapRawData 呈现清晰/白色的颜色吗?
    • 由于分量是UInt8s,所以需要在0-255的范围内指定每个,而不是0.0-1.0。
    • 我已经尝试了 [255,255,255,255] 和 [255,255,255],结果是:prntscr.com/bk6fq4 .. ah :\ 我们错过了什么吗?
    • 你能用你如何将这些值写入数组来更新问题吗?为了清楚起见,您需要数组中这些值的宽度 * 高度副本,以便用您选择的颜色填充整个纹理。当我将 repeatedValue 参数设置为 255(即背景变为白色而不是黑色)时,它似乎对我有用。
    • 有效!老实说,我觉得 Metal 超出了我的水平。我很难理解复制的代码哈哈。我正在考虑重新创建这个全粒子系统,因为你说这不是创建它的正确和更有效的方式。你能指导我,或者发送一些可以引导我进入这个粒子系统的资源吗? (正确的方式)
    【解决方案3】:

    我浏览了你的代码,看不到你设置背景颜色的地方。

    金属层作为子层添加到其中,因此您必须明确设置它。

    ParticialLab 类的 init 方法末尾添加这一行,看看它是否有效。

    self.backgroundColor = UIColor.redColor().CGColor
    

    【讨论】:

    • 仍然是黑色的.. 正如warrenm 建议的那样,它可能与正在渲染/计算的子层有关,但我不明白我应该将renderPassDescriptor 放在哪里。 (见他对上述问题的评论)
    • 他建议创建一个renderPassDescriptor并设置颜色附件,然后通过传入renderPassDescriptor来创建一个MTLRenderCommandEncoder
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 2012-04-21
    • 2017-08-11
    • 2015-10-24
    • 2015-06-23
    相关资源
    最近更新 更多