我们的应用可让用户上传自定义图片作为SCNNodes的素材,您可以在下面的屏幕截图和代码中看到。
屏幕截图1显示了材料使用1的刻度时的SCNNodes。
屏幕截图2显示了相同的节点,其比例为2.
使用2的比例显着锐化纹理/材质时,由于wrapS
和wrapT
属性,它也会重复图像。使用Mirror
或Clamp
代替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
}
纹理:
答案 0 :(得分:2)
您需要根据图像在屏幕上,相机最近的位置以及最大程度的透视失真来考虑实际像素。
因此,举例来说,靠近相机的立方体,在场景的左侧,可能有一个非常接近镜头的边缘"相机,并占据(例如)屏幕的y轴(高度)的大部分。如果这是一个常见的场景,在你的游戏中,那么以(真实)像素为目标猜测这个大小将让你知道你需要多大的纹理锐度。
这是3D引擎中存在LOD(细节级别)功能的原因之一,因此并非场景中的所有对象都需要始终拥有最佳,最高质量的纹理,也不是最大数量的用多边形来表达它们的形状。
在大多数3D引擎中,还有不同类型的纹理处理算法,用于平滑。关闭它们,如果它们存在于SceneKit中,对获得锐利(呃)纹理也是一个很大的好处。
(不直接适用于您的请求,但会显示其工作原理)
https://developer.apple.com/reference/scenekit/scnlevelofdetail
这更适用。这个"技巧"真的很老了,我记得第一张3D卡。它会使纹理变小:
https://developer.apple.com/reference/scenekit/scnmaterialproperty/1395398-mipfilter
我把它看成是非常自动的,第二眼看:
从上面的页面:
" SceneKit会自动为材质创建多个mipmap级别 属性的图像内容,每个都是原始图像的一小部分 尺寸。渲染时,SceneKit会自动对纹素进行采样 最接近正在渲染的尺寸的mipmap级别。"