Sprite kit 为什么SceneKit材质看起来不同,即使图像相同?

Sprite kit 为什么SceneKit材质看起来不同,即使图像相同?,sprite-kit,scenekit,Sprite Kit,Scenekit,材质内容支持许多要加载的选项,其中两个是NSImage(或UIImage)和SKTexture 我注意到,当使用不同的加载程序加载同一个图像文件(.png)时,材质呈现不同 我非常确定它是从SpriteKit转换加载的额外属性,但我不知道它是什么 为什么SceneKit材质看起来不同,即使图像相同 这是渲染的示例: 关于代码: let plane = SCNPlane(width: 1, height: 1) plane.firstMaterial?.diffuse.contents = NS

材质内容支持许多要加载的选项,其中两个是NSImage(或UIImage)和SKTexture

我注意到,当使用不同的加载程序加载同一个图像文件(.png)时,材质呈现不同

我非常确定它是从SpriteKit转换加载的额外属性,但我不知道它是什么

为什么SceneKit材质看起来不同,即使图像相同

这是渲染的示例:

关于代码:

let plane = SCNPlane(width: 1, height: 1)
plane.firstMaterial?.diffuse.contents = NSColor.green

完整的示例如下:

我认为这与颜色空间/伽马校正有关。我的猜测是,通过
SKTexture(ImageName:)
初始值设定项加载的纹理没有正确地进行gamma校正。你可能会认为这会被记录在某个地方,或者其他人会注意到,但我似乎找不到任何东西

这里有一些代码可以与链接示例项目中的最后一个图像交换。为了简洁起见,我尽可能地强制展开:

//使用SKTexture(cgImage:)init创建纹理
//证明它与SKTexture(ImageName:)具有相同的输出图像
让originalDogNSImage=NSImage(命名为:“dog”)!
var originalDogRect=CGRect(x:0,y:0,width:originalDogNSImage.size.width,height:originalDogNSImage.size.height)
让originaldoggimage=originalDogNSImage.cgImage(forProposedRect:&originalDogRect,context:nil,hints:nil)!
让originalDogTexture=SKTexture(cgImage:originaldoggimage)
//创建原始映像的ciImage以用作CIFilter的输入
让imageData=originalDogNSImage.tiffRepresentation!
设ciImage=ciImage(数据:imageData)
//创建gamma调整核心图像过滤器
让gammaFilter=CIFilter(名称:“CIGammaAdjust”)!
gammaFilter.setValue(ciImage,forKey:kCIInputImageKey)
//默认值为0.75。2.2使狗图像与NSImage(名称:)初始化器基本匹配
gammaFilter.setValue(2.2,forKey:“inputPower”)
//使用CIFilter的输出创建SKTexture
让gammaCorrectedDogCIImage=gammaFilter.outputImage!
让gammacorrecteddogcimage=CIContext().createCGImage(gammacorrecteddogcimage,from:gammacorrecteddogcimage.extent)!
设gammaCorrectedDogTexture=SKTexture(cgImage:gammaCorrectedDogCGImage)
//看起来很糟糕,如图中所示。
//让PlaneWithKTextureDog=planeWith(扩散内容:原始纹理)
//看起来不错
让PlaneWithKTextureDog=planeWith(扩散内容:gammaCorrectedDogTexture)

使用
CIGammaAdjust
过滤器并将
inputPower
设置为2.2,会使
SKTexture
几乎消失吗?匹配
NSImage(命名:)
init。我已经包含了通过
SKTexture(cgImage:)
加载的原始图像,以排除使用该初始值设定项与您询问的
SKTexture(imagename:)
相比所引起的任何更改。

我认为这与颜色空间/伽马校正有关。我的猜测是,通过
SKTexture(ImageName:)
初始值设定项加载的纹理没有正确地进行gamma校正。你可能会认为这会被记录在某个地方,或者其他人会注意到,但我似乎找不到任何东西

这里有一些代码可以与链接示例项目中的最后一个图像交换。为了简洁起见,我尽可能地强制展开:

//使用SKTexture(cgImage:)init创建纹理
//证明它与SKTexture(ImageName:)具有相同的输出图像
让originalDogNSImage=NSImage(命名为:“dog”)!
var originalDogRect=CGRect(x:0,y:0,width:originalDogNSImage.size.width,height:originalDogNSImage.size.height)
让originaldoggimage=originalDogNSImage.cgImage(forProposedRect:&originalDogRect,context:nil,hints:nil)!
让originalDogTexture=SKTexture(cgImage:originaldoggimage)
//创建原始映像的ciImage以用作CIFilter的输入
让imageData=originalDogNSImage.tiffRepresentation!
设ciImage=ciImage(数据:imageData)
//创建gamma调整核心图像过滤器
让gammaFilter=CIFilter(名称:“CIGammaAdjust”)!
gammaFilter.setValue(ciImage,forKey:kCIInputImageKey)
//默认值为0.75。2.2使狗图像与NSImage(名称:)初始化器基本匹配
gammaFilter.setValue(2.2,forKey:“inputPower”)
//使用CIFilter的输出创建SKTexture
让gammaCorrectedDogCIImage=gammaFilter.outputImage!
让gammacorrecteddogcimage=CIContext().createCGImage(gammacorrecteddogcimage,from:gammacorrecteddogcimage.extent)!
设gammaCorrectedDogTexture=SKTexture(cgImage:gammaCorrectedDogCGImage)
//看起来很糟糕,如图中所示。
//让PlaneWithKTextureDog=planeWith(扩散内容:原始纹理)
//看起来不错
让PlaneWithKTextureDog=planeWith(扩散内容:gammaCorrectedDogTexture)

使用
CIGammaAdjust
过滤器并将
inputPower
设置为2.2,会使
SKTexture
几乎消失吗?匹配
NSImage(命名:)
init。我已经包括了通过
SKTexture(cgImage:)
加载的原始图像,以排除使用该初始值设定项与您所问的
SKTexture(imagename:)
所引起的任何更改。

Omg!!谢谢它工作得很好,测试了一点,我发现最接近gamma的是1.75,我将更新答案以备将来搜索。非常感谢你!天啊!!谢谢它工作得很好,测试了一点,我发现最接近gamma的是1.75,我将更新答案以备将来搜索。非常感谢你!
let plane = SCNPlane(width: 1, height: 1)
plane.firstMaterial?.diffuse.contents = NSImage(named: "texture")
let plane = SCNPlane(width: 1, height: 1)
plane.firstMaterial?.diffuse.contents = SKTexture(imageNamed: "texture")