У меня есть сцена, в которой много объектов, у всех есть разные текстуры. По какой-то причине у 2 объектов есть красный оттенок, хотя их текстуры не имеют красного цвета. Вы все еще можете видеть узор в текстуре, он просто имеет разные оттенки на красном. (На симуляторе 2 объекта имеют черно-белые текстуры и на оттенках устройства красного цвета) Кто-нибудь знает, почему это происходит? Другие объекты работают нормально.Scenekit некоторые текстуры имеют красный оттенок
ответ
Для материалов, таких как metalness
и roughness
SceneKit имеет поддержку 1-канального (полутонового) изображения. Чтобы сохранить память, эти изображения сохраняются как оттенки серого, они не преобразуются в текстуры RGB, которые имеют одинаковые данные в каждом канале.
Когда вы используете такое изображение для свойства «цветного» материала (например, diffuse
), SceneKit будет запрашивать красные, зеленые и синие компоненты образца, а зеленый и синий всегда будут 0, и изображение появится красный.
Одно неудачное решение заключается в переработке вашей текстуры в приложении для редактирования изображений, так что оно сохраняется как RBG вместо оттенков серого.
Вы также можете попробовать модификаторы шейдеров для преобразования из серого в RGB:
_surface.diffuse.rgb = _surface.diffuse.rrr;
У меня была та же проблема с PNG текстуры индексированных цветов.
Что я сделал для решения проблемы, было преобразование png индексированного цвета в png truecolor.
Это может быть ошибка NSImage. Когда я использовал CGImage для загрузки файла png, это не вызвало никаких проблем.
let url = URL(fileURLWithPath: pngFileName, relativeTo: directoryPath)
// let reddishImage = NSImage(contentsOf: url)
let cgDataProvider = CGDataProvider(url: url as CFURL)!
let cgImage = CGImage(pngDataProviderSource: cgDataProvider, decode: nil, shouldInterpolate: false, intent: CGColorRenderingIntent.defaultIntent)!
let imageSize = CGSize(width: cgImage.width, height: cgImage.height)
let correctImage = NSImage(cgImage: cgImage, size: imageSize)
У меня была такая же проблема с загрузкой (серый) .png изображения в качестве текстуры для SCNMaterial
.
На симуляторе это выглядело отлично. Но на устройстве все изображения с черным, белым или серым цветом отображаются с красным базовым цветом.
let texture = SCNMaterial()
texture.diffuse.contents = UIImage(named: "rgb image with only gray")
Я решил эту проблему путем создания нового UIImage
из данного UIImage
:
let texture = SCNMaterial()
var newImage: UIImage?
if let textureImage = UIImage(named: "rgb image with only gray") {
UIGraphicsBeginImageContext(textureImage.size)
let width = textureImage.size.width
let height = textureImage.size.height
textureImage.draw(in: CGRect(x: 0, y: 0, width: width, height: height))
newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
texture.diffuse.contents = newImage
НТН
Это работает! У меня была проблема на некоторых устройствах (iPhone X, где моя чистая белая + альфа-текстура была показана красным цветом), а не на других (iPad Pro, где она выглядит правильно), и это обходное решение устранило ее. Очевидно, что что-то происходит с оригинальным ресурсом изображения или его загрузкой с помощью UIImage, возможно, вместо того, чтобы использовать RGB вместо одного RGB-изображения, и при этом его интерпретировать как красное только на некоторых устройствах. – Clafou
Я не думаю, что я понял. Моя текстура уже RGB. И я просто перетащил текстуру в модель так же, как я сделал с каждым объектом. – Colddog
И, сказав, что моя текстура RGB, я имею в виду, что у нее есть цвета. – Colddog
Возможно, я неправильно понял, что вы имели в виду под термином «На симуляторе 2 объекта имеют черно-белые текстуры и на оттенках устройства красного цвета»). Можете ли вы публиковать снимки изображения и как они выглядят один раз на сцене? – mnuages