SceneKit:增加用于SCNNode材质的纹理的锐度?

时间:2016-09-17 00:34:52

标签: ios textures scenekit scene scnnode

我们的应用可让用户上传自定义图片作为SCNNodes的素材,您可以在下面的屏幕截图和代码中看到。

屏幕截图1显示了材料使用1的刻度时的SCNNodes。

屏幕截图2显示了相同的节点,其比例为2.

使用2的比例显着锐化纹理/材质时,由于wrapSwrapT属性,它也会重复图像。使用MirrorClamp代替Repeat这些属性并没有帮助。

在SceneKit或UIKit中,您可以提供更高分辨率的图像并缩小比例以提高不同设备的清晰度。例如,对于50x50按钮,您提供100x100图像。通过在底部的UIKit组件中渲染时查看相同图像的清晰度,可以看到同一图像的UIKit清晰度和SceneKit清晰度之间的对比度。

1)你如何将相同的原则应用于SceneKit?

2)更重要的是,如何在避免重复行为的同时实现屏幕截图2的纹理/材质清晰度?

代码:

// Create box geometry
let box = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.0)
box.firstMaterial!.diffuse.contents = style.getContents() // This returns a UIImage
box.firstMaterial!.specular.contents = UIColor.whiteColor()

// Increase resolution for image styles
let scale = Float(2)
if style.type == .Image {
    box.firstMaterial!.diffuse.contentsTransform = SCNMatrix4MakeScale(scale, scale, scale)
    //box.firstMaterial!.locksAmbientWithDiffuse = true
    box.firstMaterial!.diffuse.wrapS = .Repeat
    box.firstMaterial!.diffuse.wrapT = .Repeat
    box.firstMaterial!.diffuse.mipFilter = .Linear
}

纹理:

enter image description here enter image description here enter image description here

屏幕截图1: enter image description here

屏幕截图2: enter image description here

1 个答案:

答案 0 :(得分:2)

您需要根据图像在屏幕上,相机最近的位置以及最大程度的透视失真来考虑实际像素。

因此,举例来说,靠近相机的立方体,在场景的左侧,可能有一个非常接近镜头的边缘"相机,并占据(例如)屏幕的y轴(高度)的大部分。如果这是一个常见的场景,在你的游戏中,那么以(真实)像素为目标猜测这个大小将让你知道你需要多大的纹理锐度。

这是3D引擎中存在LOD(细节级别)功能的原因之一,因此并非场景中的所有对象都需要始终拥有最佳,最高质量的纹理,也不是最大数量的用多边形来表达它们的形状。

在大多数3D引擎中,还有不同类型的纹理处理算法,用于平滑。关闭它们,如果它们存在于SceneKit中,对获得锐利(呃)纹理也是一个很大的好处。

几何细节级别

(不直接适用于您的请求,但会显示其工作原理)

https://developer.apple.com/reference/scenekit/scnlevelofdetail

纹理"缩放" (mip mapping)

这更适用。这个"技巧"真的很老了,我记得第一张3D卡。它会使纹理变小:

https://developer.apple.com/reference/scenekit/scnmaterialproperty/1395398-mipfilter

我把它看成是非常自动的,第二眼看:

从上面的页面:

  

" SceneKit会自动为材质创建多个mipmap级别   属性的图像内容,每个都是原始图像的一小部分   尺寸。渲染时,SceneKit会自动对纹素进行采样   最接近正在渲染的尺寸的mipmap级别。"