2016-10-15 3 views
4

У меня есть сцена, в которой много объектов, у всех есть разные текстуры. По какой-то причине у 2 объектов есть красный оттенок, хотя их текстуры не имеют красного цвета. Вы все еще можете видеть узор в текстуре, он просто имеет разные оттенки на красном. (На симуляторе 2 объекта имеют черно-белые текстуры и на оттенках устройства красного цвета) Кто-нибудь знает, почему это происходит? Другие объекты работают нормально.Scenekit некоторые текстуры имеют красный оттенок

ответ

2

Для материалов, таких как metalness и roughness SceneKit имеет поддержку 1-канального (полутонового) изображения. Чтобы сохранить память, эти изображения сохраняются как оттенки серого, они не преобразуются в текстуры RGB, которые имеют одинаковые данные в каждом канале.

Когда вы используете такое изображение для свойства «цветного» материала (например, diffuse), SceneKit будет запрашивать красные, зеленые и синие компоненты образца, а зеленый и синий всегда будут 0, и изображение появится красный.

Одно неудачное решение заключается в переработке вашей текстуры в приложении для редактирования изображений, так что оно сохраняется как RBG вместо оттенков серого.

Вы также можете попробовать модификаторы шейдеров для преобразования из серого в RGB:

_surface.diffuse.rgb = _surface.diffuse.rrr; 
+0

Я не думаю, что я понял. Моя текстура уже RGB. И я просто перетащил текстуру в модель так же, как я сделал с каждым объектом. – Colddog

+0

И, сказав, что моя текстура RGB, я имею в виду, что у нее есть цвета. – Colddog

+0

Возможно, я неправильно понял, что вы имели в виду под термином «На симуляторе 2 объекта имеют черно-белые текстуры и на оттенках устройства красного цвета»). Можете ли вы публиковать снимки изображения и как они выглядят один раз на сцене? – mnuages

0

У меня была та же проблема с 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) 
1

У меня была такая же проблема с загрузкой (серый) .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 

НТН

+0

Это работает! У меня была проблема на некоторых устройствах (iPhone X, где моя чистая белая + альфа-текстура была показана красным цветом), а не на других (iPad Pro, где она выглядит правильно), и это обходное решение устранило ее. Очевидно, что что-то происходит с оригинальным ресурсом изображения или его загрузкой с помощью UIImage, возможно, вместо того, чтобы использовать RGB вместо одного RGB-изображения, и при этом его интерпретировать как красное только на некоторых устройствах. – Clafou

 Смежные вопросы

  • Нет связанных вопросов^_^