Я пробовал 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")
Показывает странный результат следующим образом.
Это должна быть нормальная текстура шара.
В чем может быть проблема? и как я могу использовать текстуру .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 просматривает список форматов пикселей, которые он поддерживает здесь .