SCNMaterialProperty

2020-08-23  本文已影响0人  AntKing

SCNMaterialProperty

class SCNMaterialProperty : NSObject

一种容器,用于显示一种材料的视觉属性的颜色或纹理。

一种材料具有多种视觉特性,这些特性共同决定了其在光照和阴影下的外观。 SceneKit通过将来自材质属性的信息与灯光的位置,强度和颜色进行组合来渲染场景中的每个像素。

材质属性的内容可以是在材质表面上提供均匀效果的颜色,也可以是纹理,SceneKit使用材质所附着的几何对象提供的纹理坐标在材质表面上映射材质。反过来,纹理可以来自多种来源,例如图像对象,图像文件的URL,特殊格式的图像或用作立方体贴图的图像集,甚至是Core Animation提供的动画内容。 ,SpriteKit或AVFoundation-有关完整的选项集,请参见contents属性。

注意

通常,在使用第三方创作工具创建3D资源时,您会将纹理图像与材质相关联,并且包含这些资源的场景文件会引用外部图像文件。为了在运输应用程序捆绑包中的资产时获得最佳结果,请将场景文件放置在扩展名为.scnassets的文件夹中,并将引用为来自这些场景的纹理的图像文件放置在Asset Catalog中。

然后,Xcode优化场景和纹理资源,以在每个目标设备上实现最佳性能,并为交付功能(例如应用程序细化和按需资源)准备纹理资源。
SceneKit对材质的每个视觉属性以不同的方式使用材质属性的内容对象。例如:

为漫反射属性提供颜色时,它将确定材质的基本颜色-使用材质的几何形状在白光照射下会以该颜色的渐变显示为阴影。如果改为提供图像,则SceneKit会在几何图形的表面上映射图像,而不是使用统一的基础颜色进行着色。

为镜面反射属性提供颜色时,它会影响使用该材料从几何图形表面直接反射向查看器的光的颜色。如果改为提供灰度图像,则可以确定材料将光直接反射向观看者的趋势-图像中的较亮像素使该材料的那些区域显得更有光泽,而较暗的像素使该材料的外观变得更粗糙。

法线属性指定表面在每个点的方向。默认情况下,材质均匀光滑,因此为该属性指定颜色不会产生任何效果。相反,您可以为此属性指定一个描述曲面轮廓的图像。 SceneKit在照明中使用此图像(称为法线贴图),在不增加几何形状复杂性的情况下,创建了复杂,凹凸不平的表面的错觉。

有关每个视觉属性及其内容影响材料外观的方式的更多详细信息,请参见SCNMaterial。

SceneKit在其他地方也使用SCNMaterialProperty对象:

为了在SCNScene对象的background属性中提供要在场景后呈现的内容,

要影响光源照明的颜色和形状,请使用SCNLight对象的gobo属性。

将纹理采样器绑定到符合SCNShadable协议的类中的自定义GLSL着色器源代码片段。

convenience init(contents: Any)
用指定的contents 创建一个 材料属性对象,这个contents可以是很多内容,比如颜色,图片,视频,添加CoreAnimation 的CALayer等
var contents: Any? { get set }
材质属性的视觉内容-颜色,图像或动画内容的来源。 可动画的。
var intensity: CGFloat { get set }
0.0到1.0之间的数字,可调节材料属性的效果。 可动画的。
默认强度为1.0。 降低强度会使材质属性的内容淡出,从而根据其代表的SCNMaterial对象的视觉属性而产生不同的效果:

对于法线特性,强度会改变法线映射表面的外观粗糙度。 降低强度可使表面看起来更平滑。

对于乘法属性,降低强度会将材料属性的颜色与白色混合,从而有效降低了乘法效果的强度。

对于其他所有属性,降低强度会使材质属性的内容变暗。

您可以对此属性的值进行动画处理。 请参见使SceneKit内容动画化。
var contentsTransform: SCNMatrix4 { get set }
应用于材质属性的变换, 可动画的
SceneKit将此转换应用于材质附加到的几何对象提供的纹理坐标,然后使用所得坐标在材质表面上映射材质属性的内容。 (如果材质属性的内容对象是恒定的颜色,则此转换无效。)

例如,您可以使用此属性相对于材料表面生长,偏移或旋转纹理,如下所示。

var wrapS: SCNWrapMode { get set }
S纹理坐标的包装行为。
对于材料的纹理坐标超出0.0到1.0范围的情况,包装模式决定纹理映射行为。 例如,如果使用contentsTransform属性相对于几何图形的表面收缩纹理,则可以使用环绕模式属性来确定纹理是否在整个表面上重复。

S纹理坐标测量纹理图像的水平轴,从图像左边缘的0.0增加到右边缘的1.0。

默认包装模式为SCNWrapMode.clamp。 有关可用模式及其效果,请参见SCNWrapMode。

image.png
缩小过滤器
var minificationFilter: SCNFilterMode { get set }
纹理过滤,用于以比原始图像小的尺寸来渲染材质属性的图像内容。
var mipFilter: SCNFilterMode { get set }
用于使用mipmaps渲染材质属性的图像内容的纹理过滤,其尺寸小于原始图像的尺寸。

Mipmapping是当以较小的尺寸渲染纹理图像时可以提高渲染性能的技术。 SceneKit会为材质属性的图像内容自动创建多个mipmap级别,每个级别的大小仅为原始图像的一小部分。渲染时,SceneKit会从mipmap级别自动采样最接近要渲染的大小的纹理像素。

如果此属性的值为SCNFilterMode.none,则SceneKit不使用mipmapping。如果此属性的值为SCNFilterMode.linear,则SceneKit使用三线性过滤确定像素颜色。首先,它从最接近目标尺寸的两个mipmap级别中的每个线性地对texel颜色进行插值,然后在两个结果之间进行线性插值以确定最终颜色。此技术以适中的性能成本提供了更高的渲染质量。

在iOS 10,tvOS 10,watchOS 3和macOS 10.12中,默认的mipmapping过滤器模式为SCNFilterMode.nearest。在早期的OS版本中,默认模式为SCNFilterMode.none。

下图显示了启用mipmapping的效果。在左侧的图像中,禁用了mipmapping,当棋盘图案退回到远处时会导致像素化伪像。启用线性mipmapping可使外观更平滑。
image.png
var maxAnisotropy: CGFloat { get set }
渲染材质属性的图像内容时要使用的各向异性纹理过滤量。
值越大,渲染效果越好,但是同时消耗的性能也大, 当值小于1时, anisotropic filtering 失效
var mappingChannel: Int { get set }
纹理坐标的来源,用于映射材质属性的图像内容。

上一篇下一篇

猜你喜欢

热点阅读