SKTexture неправильно распознает размер текстуры .pvrtc, используемый с SceneKit - PullRequest
0 голосов
/ 09 мая 2018

Я пробовал texturetool и графический интерфейс пользователя PVRTexTool, чтобы сгенерировать текстуру .pvrtc с форматом 4 бита на пиксель для загрузки с помощью SceneKit через Swift через SKTexture, а затем, наконец, получить ее для использования в качестве диффузной текстуры для SCNSphere как следующий код

let diffuse_cloudTexture = SKTexture(imageNamed: "dc_4096.pvr")
let node = SCNNode()
node.geometry = SCNSphere(radius: 1)
node.geometry!.firstMaterial!.diffuse.contents = SKTexture(rect: CGRect(x: 0, y: 0, width: 4096, height: 2048), in: diffuse_cloudTexture)
node.geometry!.firstMaterial!.normal.contents = UIImage(named: "normal")
node.geometry!.firstMaterial!.isDoubleSided = false
node.geometry!.firstMaterial!.shininess = 10
node.geometry!.firstMaterial!.isLitPerPixel = true
scene.rootNode.addChildNode(node)
... <other unrelated code left out>

Я указал CGRect выше, чтобы указать внутри текстуры. Я включил 2 текстуры внутри исходной текстуры для генерации. Верхняя часть - это текстура облака, а нижняя - диффузная.

Для texturetool Я использовал следующую команду

texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o dc_4096.pvrtc -f PVR -p dc_4096_preview.png source_4096.png 

Для PVRTexTool Я пробовал оба формата => PVRTC 4bpp и PVRTCII 4bpp для OpenGL 2.0.

Одним заметным отличием является то, что этот инструмент генерируется в .pvr, а первый - в .pvrtc. Таким образом, я использую соответствующий суффикс в коде как таковой в зависимости от того, какой инструмент использовался для создания такой текстуры.

Что бы я ни делал, все пусто и прозрачно. Сфера не имеет текстуры. Из журнала отладки я что-то распечатываю через

print(diffuse_cloudTexture.debugDescription)
print(diffuse_cloudTexture.textureRect())
print(diffuse_cloudTexture.size())

и показывает

<SKTexture> 'dc_4096.pvr' (128 x 128)
(0.0, 0.0, 1.0, 1.0)
(128.0, 128.0)
top: 0.0, bottom: 0.0

почему он распознает только 128x128 в размере. Вместо этого у меня размер 4096х4096.


Дополнительно, если используется, используйте следующий код

let diffuse_cloudTexture = SKTexture(imageNamed: "dc_4096.pvr")
let node = SCNNode()
node.geometry = SCNSphere(radius: 1)
node.geometry!.firstMaterial!.diffuse.contents = diffuse_cloudTexture
node.geometry!.firstMaterial!.normal.contents = UIImage(named: "normal")

Показывает странный результат следующим образом.

enter image description here

Это должна быть нормальная текстура шара.


В чем может быть проблема? и как я могу использовать текстуру .pvrtc со SceneKit независимо от того, используется ли SKTexture или нет?

редактировать

(поиск решения все еще развивается)

  • во-первых, благодаря @KnightOfDragon, как видно из комментария. Странная текстура при загрузке - это изображение X по умолчанию, когда не удается найти текстуру для загрузки. Теперь я вижу SKTexture: Error loading image resource: "dc_4096.pvrtc". Таким образом, разрешение текстуры 128x128 должно соответствовать изображению по умолчанию X.
  • Это верно. Похоже, SKTexture не поддерживает тип .pvr, так как @KnightOfDragon указал мне в комментарии. Поэтому я просто попытался использовать MTLTexture через MTKTextureLoader и теперь могу рендерить текстуру на сферу. Следующая проблема, с которой я сталкиваюсь, заключается в том, как получить только часть полной текстуры таким же образом, как SKTexture может сделать через SKTexture(rect: ...<rect to grab>, in: ...<SKTexture>...). Подсказка, которую я узнал, MTLTexture поддерживает .pvr просматривает список форматов пикселей, которые он поддерживает здесь .
...