2017-01-22 37 views
2

我無法弄清楚如何爲SKTexture紋理應用mipmap。我在Swift中使用XCode 8.2.1。SpriteKit SKTexture mipmap不起作用

這裏是我的方法:

override func sceneDidLoad() { 
    logo = childNode(withName: "logo") as! SKSpriteNode 
    let texture: SKTexture! = SKTexture.init(imageNamed: "logo") 
    texture.usesMipmaps = true 
    logo.texture = texture 
} 

我用的樣本圖像PNG 512 * 512大小(鍋兩者) 它看起來像這樣全尺寸: full size image

然後我想減少它的大小128×128像素

decrease size

這裏是與輸出mipmapping貼圖啓用: mipmapping enabled output 128*128

再舉例來說,輸出無mipmapping貼圖(僅默認線性過濾)without mipmapping

他們都看起來是一樣的。所以我認爲mipmap不適用。請幫助我,我花了3天試圖解決這個問題。

UPD: 由於Confused告訴我,我在代碼中完成了所有工作。使用mipmaping創建紋理後,將其分配給SKSpriteNode,然後按比例縮放方法或動作執行縮放。

let texture = SKTexture.init(imageNamed: "logo") 
texture.usesMipmaps = true 
logo = SKSpriteNode.init(texture: texture) 
logo.position = CGPoint(x: 0, y: 0) 
self.addChild(logo) 
//logo.scale(to: CGSize(width: 128, height: 128)) 
let scaleAction = SKAction.scale(to: CGSize(width: 128, height: 128), duration: 1) 
    logo.run(scaleAction) 

結果是一樣的: enter image description here

+2

你說得對。他們完全一樣。我將它們放入Photoshop中,並進行了差異混合。沒有mipmapping的那個在你的屏幕截圖中應該是它的左邊的一個像素,但是一旦這個更正了,它們是相同的。 – Confused

回答

1

一點也不覺得奇怪,在所有的,如果Xcode的SpriteKit場景編輯器做你的紋理的大小調整的紋理映射是由代碼激活之前。這意味着紋理的128x128版本會進行mipmap,因爲這就是Xcode和SpriteKit SceneEditor合作存儲爲紋理的原因。

因此,而不是設置在場景編輯器規模,在你的代碼打開紋理映射後,使用此縮放SKSpriteNode:

https://developer.apple.com/reference/spritekit/skspritenode/1645445-scale

和/或實驗與SKAction縮放操作:

https://developer.apple.com/reference/spritekit/skaction

通過這種方式,你可以絕對確保事件的順序是

  1. 打開紋理映射
  2. 執行縮放

並希望這個工程。

+0

謝謝你的回答,但它沒有幫助。看看上面的UPD。 – widesteppe

+0

DOH!你測試過哪些設備? – Confused

+0

在我的mac和iOS模擬器上測試。 – widesteppe