2016-10-15 49 views
4

我有一个场景有许多对象,都有不同的纹理。由于某种原因,2个物体对它们有红色调,即使它们的纹理没有红色。你仍然可以看到纹理中的图案,它只是在红色上有不同的阴影。 (在模拟器上,2个物体具有黑色和白色纹理以及红色设备色调)有没有人知道为什么会发生这种情况?其他对象工作正常。Scenekit一些纹理有红色色调

回答

2

对于材质属性,如metalnessroughness 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。

它可能是一个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") 

我通过创建从给定UIImageUIImage解决了这个问题:

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 

HTH

+0

这个工程!我在某些设备(iPhone X,我的纯白色+ alpha纹理以红色显示)而不是其他设备(iPad Pro,它看起来正确)上遇到问题,并且此解决方法解决了此问题。很明显,原始图像资源或UIImage加载的内容可能会发生变化,可能会转换为单通道图像而不是RGB,导致仅在某些设备上将其解释为红色。 – Clafou