Scenekit的一些纹理有红色色调

时间:2016-10-15 11:18:00

标签: swift textures scenekit

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

3 个答案:

答案 0 :(得分:7)

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