我有一个有很多物体的场景,它们都有不同的纹理。出于某种原因,2个物体具有红色色调,即使它们的纹理没有红色。您仍然可以在纹理中看到图案,它在红色上只有不同的阴影。 (在模拟器上,2个物体有黑色和白色纹理,设备色调为红色)有没有人知道为什么会发生这种情况?其他对象工作正常。
答案 0 :(得分:7)
对于metalness
和roughness
等材质属性,SceneKit支持1通道(灰度)图像。为了节省内存,这些图像保持为灰度纹理,它们不会转换为每个通道中具有相同数据的RGB纹理。
当您将这样的图像用于"彩色"材质属性(例如diffuse
),SceneKit会询问样本的红色,绿色和蓝色成分,但绿色和蓝色将始终为0,图像将显示为红色。
一个不幸的解决方案是在图像编辑应用程序中重新设计纹理,以便将其保存为RBG而不是灰度。
您还可以尝试着色器修改器从灰度转换为RGB:
_surface.diffuse.rgb = _surface.diffuse.rrr;
修改强>
启动iOS 11时,您可以在使用单通道纹理时使用textureComponents
属性:
material.diffuse.textureComponents = .red
答案 1 :(得分:3)
我将加载(灰色).png图像作为conda env export > environment.yml
的纹理时遇到了同样的问题。
在模拟器上它渲染得很好。但是在设备上,所有只有黑色,白色或灰色的图像都会呈现红色基色。
SCNMaterial
我通过从给定的let texture = SCNMaterial()
texture.diffuse.contents = UIImage(named: "rgb image with only gray")
:
UIImage
来解决此问题
UIImage
HTH
答案 2 :(得分:0)
我对索引颜色的png纹理有同样的问题 我为解决问题所做的是将索引颜色png转换为truecolor 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)