這個知識點既重要又不那么重要又很重要南捂。攤手坞琴。
簡單說坏为,這個屬性就是給geometry
貼圖鲸匿。(下文中的“貼圖”爷怀,就是material
的意思)
每個SCNMaterial
有8個視覺特性,分別對應(yīng)在明暗過程中不同的貼圖效果带欢。每個視覺特性运授,都是SCNMaterialProperty
的一個實例,可以提供一個顏色或紋理等2D內(nèi)容乔煞。SCNMaterial
的lightingModelName
也會影響到渲染的最終效果吁朦。詳見下文。
可以使用firstMaterial
或者materials
屬性添加一個或多個貼圖渡贾。多個幾何圖形可以用相同的貼圖逗宜,這樣修改貼圖就可以同時改變所有使用它的幾何。
創(chuàng)建貼圖
+ (instancetype)material;
創(chuàng)建一個新的貼圖空骚,它的8個視覺特性的默認(rèn)值參見下文“視覺特性配置”纺讲。
+ (instancetype)materialWithMDLMaterial:(MDLMaterial *)mdlMaterial;
根據(jù)MDLMaterial
對象創(chuàng)建貼圖。
選擇陰影模型
@property(nonatomic, copy) SCNLightingModel lightingModelName;
光影渲染方式囤屹,詳見下熬甚。
typedef NSString *SCNLightingModel;
渲染貼圖的燈光和陰影算法的常數(shù)。
SCNLightingModelPhysicallyBased:基于現(xiàn)實的抽象效果肋坚。
SCNLightingModelPhong:將
ambient
乡括、diffuse
和specular
結(jié)合起來,用Phong公式計算的效果智厌。SCNLightingModelLambert:只包含
ambient
和diffuse
的效果粟判。SCNLightingModelConstant:只包含
ambient
的效果。SCNLightingModelBlinn:將
ambient
峦剔、diffuse
和specular
結(jié)合起來,用Blinn-Phong公式計算的效果角钩。
視覺特性配置
@property(nonatomic, readonly) SCNMaterialProperty *diffuse;
漫射效果吝沫。
漫射的意思是光的數(shù)量和顏色均勻地反映在幾何表面的每一點上呻澜。它與視角沒有關(guān)系,可以理解成是設(shè)置基礎(chǔ)顏色或紋理惨险。設(shè)置方法為diffuse.content
羹幸,下同。
默認(rèn)情況下是白色辫愉。下圖顯示的是一個實例栅受,它的其他視覺特性使用的默認(rèn)值。
場景中最終的渲染效果會根據(jù)所有視覺特性恭朗、燈光和其他的相關(guān)屬性共同決定屏镊。
@property(nonatomic, readonly) SCNMaterialProperty *ambient;
環(huán)境效果。
就是貼圖在在環(huán)境燈里映射出的效果痰腮。如果場景里沒有SCNLightTypeAmbient
的燈光而芥,那這個屬性將沒有效果。
默認(rèn)情況下是深灰色膀值。修改ambient
不是在場景中被燈光照亮棍丐,而是直接使貼圖變成對應(yīng)的顏色或紋理。貼圖默認(rèn)對散射光和環(huán)境光是相同的沧踏,locksAmbientWithDiffuse
默認(rèn)值為YES
歌逢。
如下圖:
@property(nonatomic, readonly) SCNMaterialProperty *specular;
鏡面效果。
用來模擬光澤翘狱,可以通過shininess
屬性來調(diào)整鏡面的銳度秘案。
默認(rèn)情況下是黑色,貼圖看起來是陰暗無光澤的盒蟆。將specular
設(shè)置成亮色踏烙,會讓表面看起來閃閃發(fā)光。當(dāng)你將圖片設(shè)置給specular
時历等,圖片中每個像素點的亮度決定了貼圖上對應(yīng)點的光澤讨惩。
如圖:
@property(nonatomic, readonly) SCNMaterialProperty *normal;
輪廓效果。
模擬輪廓效果需要每個點的方向信息寒屯。通常荐捻,geometry
對象上自帶了這些信息,但是這限制了表面輪廓的細(xì)節(jié)寡夹,因為一個幾何形狀只能為每個頂點提供一個法向量处面。如果增加頂點數(shù),又會增加性能成本菩掏。
此外魂角,也可以使用紋理圖片來提供這些信息。由于圖片紋理可以儲存比幾何圖形更詳細(xì)的表面信息智绸,我們可以用normal
屬性來模擬粗糙的表面野揪,比如石頭访忿,浮雕等。
默認(rèn)情況下是白色斯稳。將normal
設(shè)置成純色海铆,將根據(jù)幾何形狀進行渲染;將normal
設(shè)置成圖片或其他紋理圖挣惰,將自動設(shè)置貼圖的litPerPixel=YES
卧斟。
如圖:
@property(nonatomic, readonly) SCNMaterialProperty *reflective;
反射效果。
SceneKit
不會渲染對象在場景中的真實映射憎茂,我們可以通過reflective
來模擬這個效果珍语。
默認(rèn)情況下是白色,不會有反射的效果唇辨。將reflective
設(shè)置成純色將只會給貼圖添加一層均勻的陰影廊酣,要想有反射效果,需要設(shè)置成圖片或其他紋理圖赏枚。
如圖:
@property(nonatomic, readonly) SCNMaterialProperty *emission;
發(fā)光效果亡驰。
可以利用圖片紋理來模擬表面發(fā)光的效果。不是說把貼圖當(dāng)做光源饿幅,而是指發(fā)出的光不依賴與光源凡辱。想要創(chuàng)建一個看起來發(fā)光的對象,需要將幾何圖形和發(fā)光紋理與其他的光源結(jié)合起來栗恩。
默認(rèn)情況下是黑色透乾,沒有發(fā)光效果。將emission
設(shè)置成純色只會均勻地增加與光源無關(guān)的顏色磕秤,要想有發(fā)光效果乳乌,需要設(shè)置成圖片或其他紋理圖,發(fā)光的部分用亮色市咆,其他區(qū)域用暗色汉操。
如圖:
@property(nonatomic, readonly) SCNMaterialProperty *transparent;
透明效果。
這個屬性可以選擇性地讓部分貼圖透明蒙兰×琢觯可以使用transparency
屬性來調(diào)整整體的透明度,或者使用SCNNode
的opacity
屬性來調(diào)整節(jié)點上的所有內(nèi)容搜变。
默認(rèn)情況下為黑色采缚,表示完全不透明。將transparent
設(shè)置成任何純色挠他,會根據(jù)顏色的不透明度來整體淡化貼圖扳抽。想要讓部分貼圖透明,需要設(shè)置成圖片或其他紋理圖,然后根據(jù)alpha
通道調(diào)整透明或不透明的區(qū)域贸呢。
如下圖:
@property(nonatomic, readonly) SCNMaterialProperty *multiply;
后期效果赂苗。
在貼圖的其他視覺特性與燈光以及其他相關(guān)的場景元素結(jié)合之后,將每個渲染的像素與multiply
屬性提供的顏色相乘贮尉,渲染出最終的效果∑友兀可以使用
默認(rèn)情況下是白色猜谚,表示沒有后期效果。
如下圖:
以上赌渣,8個視覺特性介紹完畢魏铅。下面還有一些其他特性
@property(nonatomic, readonly) SCNMaterialProperty *ambientOcclusion;
環(huán)境遮罩。
將一個環(huán)境遮罩紋理映射到表面坚芜。如果場景中沒有環(huán)境光(SCNLightTypeAmbient
)览芳,這個屬性沒有效果。
如果這個屬性不是nil鸿竖,SceneKit
會忽略ambient
屬性沧竟。
@property(nonatomic, readonly) SCNMaterialProperty *selfIllumination;
自照明。
這個屬性適用于所有貼圖缚忧。對于某些貼圖來說悟泵,讓它們自照明是很有必要的,比如光源被遮住的時候闪水,如果設(shè)置了selfIllumination
糕非,它們可以通過其他的光來渲染效果。
@property(nonatomic, readonly) SCNMaterialProperty *metalness;
金屬材質(zhì)球榆。
可以把這個屬性理解成折射指數(shù)朽肥。越高的值(越亮的顏色)會使表面看起來越有金屬感。
僅在lightingModelName=SCNLightingModelPhysicallyBased
時適用持钉。
@property(nonatomic, readonly) SCNMaterialProperty *roughness;
平滑度衡招。
可以把這個屬性理解成細(xì)節(jié),比如表面的突起或裂縫右钾。通過這個屬性有助于亮度的計算蚁吝,可以更真實地在粗糙或光滑的表面渲染效果。
僅在lightingModelName=SCNLightingModelPhysicallyBased
時適用舀射。
@property(nonatomic, readonly) SCNMaterialProperty *displacement;
這個是iOS11的新特性窘茁,API沒有說明,我也沒用過脆烟。以后再補充山林。
自定義貼圖
@property(nonatomic, copy) NSString *name;
貼圖的名字。
@property(nonatomic) CGFloat shininess;
鏡面效果的銳度。
詳見上文的specular驼抹。
@property(nonatomic) CGFloat fresnelExponent;
反射效果的反射率桑孩。
詳見上文的reflective。
@property(nonatomic) CGFloat transparency;
透明效果的透明度框冀。
詳見上文的transparent流椒。
@property(nonatomic) SCNTransparencyMode transparencyMode;
用來計算透明度的模式。
typedef enum SCNTransparencyMode : NSInteger {
SCNTransparencyModeAOne = 0,
SCNTransparencyModeRGBZero = 1,
SCNTransparencyModeSingleLayer = 2,
SCNTransparencyModeDualLayer = 3,
SCNTransparencyModeDefault = SCNTransparencyModeAOne
} SCNTransparencyMode;
SCNTransparencyModeAOne:從顏色的alpha通道獲取透明度信息明也。1是不透明宣虾。默認(rèn)值。
SCNTransparencyModeRGBZero:從顏色的亮度中獲取透明度信息温数。0是不透明绣硝。
SCNTransparencyModeDualLayer、SCNTransparencyModeSingleLayer也是iOS11新特性撑刺,API還沒有說明鹉胖。
@property(nonatomic, getter=isLitPerPixel) BOOL litPerPixel;
是否會每個點單獨照明。詳見上文normal够傍。
默認(rèn)YES甫菠,將提供更好的呈現(xiàn)效果,但是比較耗性能王带。改成NO會在幾何圖形的每個頂點進行照明淑蔚。可以提高渲染性能愕撰。
@property(nonatomic, getter=isDoubleSided) BOOL doubleSided;
是不是渲染兩面刹衫。
幾何圖形分為內(nèi)、外兩面搞挣。根據(jù)幾何和相機的位置決定哪一面是可見的带迟。
默認(rèn)NO,只渲染外表面囱桨,改為YES后仓犬,將渲染內(nèi)外兩面,此時從幾何內(nèi)部仍然可以觀察的渲染效果舍肠。
@property(nonatomic) SCNCullMode cullMode;
剔除模式搀继,就是不渲染哪一面。
typedef enum SCNCullMode : NSInteger {
SCNCullModeBack = 0,
SCNCullModeFront = 1
} SCNCullMode;
通常情況下翠语,幾何的內(nèi)表面封閉在幾何圖形內(nèi)叽躯,是不可見的。因此渲染內(nèi)表面并沒有明顯的效果肌括,還會消耗性能点骑。
該屬性的默認(rèn)值是SCNCullBack
,即不渲染內(nèi)表面。測試發(fā)現(xiàn)黑滴,當(dāng)doubleSided==YES
時憨募,這個屬性無效。
@property(nonatomic) SCNBlendMode blendMode;
混合模式袁辈。貼圖像素和其他的像素顏色混合的模式菜谣。
typedef enum SCNBlendMode : NSInteger {
SCNBlendModeAlpha = 0,
SCNBlendModeAdd = 1,
SCNBlendModeSubtract = 2,
SCNBlendModeMultiply = 3,
SCNBlendModeScreen = 4,
SCNBlendModeReplace = 5,
SCNBlendModeMax = 6
} SCNBlendMode;
SCNBlendModeAlpha:默認(rèn)值,將兩個像素的顏色值相乘晚缩。
SCNBlendModeAdd:將源顏色添加到目標(biāo)顏色上葛菇。類似發(fā)光的效果。
SCNBlendModeSubtract:從目標(biāo)顏色中減去源顏色橡羞。
SCNBlendModeMultiply:將源顏色與背景顏色相乘。
SCNBlendModeScreen:將源顏色的反色與目標(biāo)顏色的反色相混合济舆。
SCNBlendModeReplace:用源顏色替換目標(biāo)顏色卿泽,忽略alpha。
@property(nonatomic) BOOL locksAmbientWithDiffuse;
是否讓環(huán)境光與漫射光相同滋觉。
在模擬真實燈光時签夭,通常物體表面會有單一的基礎(chǔ)顏色或者紋理。
當(dāng)這個屬性為NO時就沒有這個限制椎侠,可以使用diffuse
屬性提供一種顏色或紋理第租,用ambient
屬性提供另一種顏色或紋理。
當(dāng)這個屬性是YES我纪,或者在SCNLightingModelPhysicallyBased
模式時慎宾,將忽略ambient
屬性,以確保只會有一種顏色或紋理浅悉。
這個屬性在OS X v10.9以前默認(rèn)值是NO趟据,之后的版本是YES。
@property(nonatomic) BOOL writesToDepthBuffer;
在渲染貼圖時是否產(chǎn)生深度信息术健。
默認(rèn)值是YES汹碱。
@property(nonatomic) BOOL readsFromDepthBuffer;
在渲染貼圖時是否使用深度信息。
默認(rèn)值是YES荞估。
@property(nonatomic) SCNColorMask colorBufferWriteMask;
typedef enum SCNColorMask : NSInteger {
SCNColorMaskNone = 0,
SCNColorMaskRed = 0x1 << 3,
SCNColorMaskGreen = 0x1 << 2,
SCNColorMaskBlue = 0x1 << 1,
SCNColorMaskAlpha = 0x1 << 0,
SCNColorMaskAll = 0xf
} SCNColorMask;
@property(nonatomic) SCNFillMode fillMode;
typedef enum SCNFillMode : NSUInteger {
SCNFillModeFill = 0,
SCNFillModeLines = 1
} SCNFillMode;
以上幾個屬性也是iOS11新特性咳促,API還沒有說明。
綜上勘伺,其實蘋果自己對自己的API也不太上心跪腹,都沒完全完成就發(fā)布了。以上部分API自己也并沒有理解透徹娇昙,如有理解不正確的地方尺迂,感謝斧正。