Я использую GKNoise с картой градиента для генерации цветового шума, получая CGImage через SKTexture в Mac OS. В частности, я использую GKPerlinNoiseSource и устанавливаю два цвета градиента со значениями -1.0 и 1.0.
Это работает должным образом, если два цвета непрозрачны. Если у одного или обоих цветов альфа-компонент меньше 1.0, я ожидаю, что результат будет прозрачным. Однако мне кажется, что альфа полностью игнорируется во вводе цвета градиента GKNoise (обрабатывается так, как будто он всегда 1.0) - или, если не игнорируется там, игнорируется при рендеринге SKTexture выходного изображения.
Я нашел пару вопросов SO, которые ссылаются на ограничения SKTexture в других целях, включая возможное обходное решение с рендерингом SKView, однако здесь это не применяется, потому что я использую только экземпляр SKTexture для получения CGImage (без использования SKView или в противном случае используя что-либо из SpriteKit) - и FWIW эти вопросы сосредоточены на iOS. Для справки:
Я ищу идеи, как заставить работать альфа-компоненты в цветах градиента с помощью GKNoise / SKTexture.
Ниже приведено тестовое изображение вывода и код, который его воспроизводит. В представлении оба изображения CGImage отрисовываются одинаково; Я ожидаю, что тот, что нарисован с красной альфа = 0,5, будет темнее в красных частях, когда фон черный, светлее, когда он белый, и т. Д.
import Foundation
import GameplayKit
class GKNoiseGradientIssue {
var redColor_opaque = NSColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
var redColor_halfAlpha = NSColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.5)
var blueColor_opaque = NSColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
var opaqueImage: CGImage
var halfAlphaImage: CGImage
init() {
let noiseSource = GKPerlinNoiseSource(frequency: 0.15,
octaveCount: 7,
persistence: 1.25,
lacunarity: 0.5,
seed: 12345)
let opaqueGradient: [NSNumber: NSColor] = [-1.0: redColor_opaque, 1.0: blueColor_opaque]
let opaqueNoise = GKNoise(noiseSource, gradientColors: opaqueGradient)
let opaqueNoiseMap = GKNoiseMap(opaqueNoise,
size: [200.0, 200.0],
origin: [0.0, 0.0],
sampleCount: [200, 200],
seamless: true)
let opaqueTexture = SKTexture(noiseMap: opaqueNoiseMap)
self.opaqueImage = opaqueTexture.cgImage()
let halfAlphaGradient: [NSNumber: NSColor] = [-1.0: redColor_halfAlpha, 1.0: blueColor_opaque]
let halfAlphaNoise = GKNoise(noiseSource, gradientColors: halfAlphaGradient)
let halfAlphaNoiseMap = GKNoiseMap(halfAlphaNoise,
size: [200.0, 200.0],
origin: [0.0, 0.0],
sampleCount: [200, 200],
seamless: true)
let halfAlphaTexture = SKTexture(noiseMap: halfAlphaNoiseMap)
self.halfAlphaImage = halfAlphaTexture.cgImage()
}
}
class GradientIssueView: NSView {
var issue: GKNoiseGradientIssue?
override func awakeFromNib() {
self.issue = GKNoiseGradientIssue()
}
override func draw(_ dirtyRect: NSRect) {
NSColor.black.setFill()
self.bounds.fill()
if let cgc = NSGraphicsContext.current?.cgContext {
cgc.draw(self.issue!.opaqueImage,
in: CGRect(origin: CGPoint(x: 10.0, y: 10.0),
size: CGSize(width: 200.0, height: 200.0)))
cgc.draw(self.issue!.halfAlphaImage,
in: CGRect(origin: CGPoint(x: 10.0, y: 220.0),
size: CGSize(width: 200.0, height: 200.0)))
}
}
}