SCNMaterial學(xué)習(xí)

這個知識點既重要又不那么重要又很重要南捂。攤手坞琴。


簡單說坏为,這個屬性就是給geometry貼圖鲸匿。(下文中的“貼圖”爷怀,就是material的意思)

每個SCNMaterial有8個視覺特性,分別對應(yīng)在明暗過程中不同的貼圖效果带欢。每個視覺特性运授,都是SCNMaterialProperty的一個實例,可以提供一個顏色或紋理等2D內(nèi)容乔煞。SCNMateriallightingModelName也會影響到渲染的最終效果吁朦。詳見下文。

可以使用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ù)。

Lighting model examples

SCNLightingModelPhysicallyBased:基于現(xiàn)實的抽象效果肋坚。
SCNLightingModelPhong:將ambient乡括、diffusespecular結(jié)合起來,用Phong公式計算的效果智厌。
SCNLightingModelLambert:只包含ambientdiffuse的效果粟判。
SCNLightingModelConstant:只包含ambient的效果。
SCNLightingModelBlinn:將ambient峦剔、diffusespecular結(jié)合起來,用Blinn-Phong公式計算的效果角钩。

視覺特性配置

@property(nonatomic, readonly) SCNMaterialProperty *diffuse;

漫射效果吝沫。
漫射的意思是光的數(shù)量和顏色均勻地反映在幾何表面的每一點上呻澜。它與視角沒有關(guān)系,可以理解成是設(shè)置基礎(chǔ)顏色或紋理惨险。設(shè)置方法為diffuse.content羹幸,下同。
默認(rèn)情況下是白色辫愉。下圖顯示的是一個實例栅受,它的其他視覺特性使用的默認(rèn)值。

Adding a diffuse texture to a material

場景中最終的渲染效果會根據(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歌逢。
如下圖:

Adding an ambient color to a material

@property(nonatomic, readonly) SCNMaterialProperty *specular;

鏡面效果。
用來模擬光澤翘狱,可以通過shininess屬性來調(diào)整鏡面的銳度秘案。
默認(rèn)情況下是黑色,貼圖看起來是陰暗無光澤的盒蟆。將specular設(shè)置成亮色踏烙,會讓表面看起來閃閃發(fā)光。當(dāng)你將圖片設(shè)置給specular時历等,圖片中每個像素點的亮度決定了貼圖上對應(yīng)點的光澤讨惩。
如圖:

Adding a specular map to a material
@property(nonatomic, readonly) SCNMaterialProperty *normal;

輪廓效果。
模擬輪廓效果需要每個點的方向信息寒屯。通常荐捻,geometry對象上自帶了這些信息,但是這限制了表面輪廓的細(xì)節(jié)寡夹,因為一個幾何形狀只能為每個頂點提供一個法向量处面。如果增加頂點數(shù),又會增加性能成本菩掏。
此外魂角,也可以使用紋理圖片來提供這些信息。由于圖片紋理可以儲存比幾何圖形更詳細(xì)的表面信息智绸,我們可以用normal屬性來模擬粗糙的表面野揪,比如石頭访忿,浮雕等。
默認(rèn)情況下是白色斯稳。將normal設(shè)置成純色海铆,將根據(jù)幾何形狀進行渲染;將normal設(shè)置成圖片或其他紋理圖挣惰,將自動設(shè)置貼圖的litPerPixel=YES卧斟。
如圖:

Adding a normal map to a material

@property(nonatomic, readonly) SCNMaterialProperty *reflective;

反射效果。
SceneKit不會渲染對象在場景中的真實映射憎茂,我們可以通過reflective來模擬這個效果珍语。
默認(rèn)情況下是白色,不會有反射的效果唇辨。將reflective設(shè)置成純色將只會給貼圖添加一層均勻的陰影廊酣,要想有反射效果,需要設(shè)置成圖片或其他紋理圖赏枚。
如圖:

Adding a reflective environment map to a material

@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ū)域用暗色汉操。
如圖:

Adding an emissive map to a material

@property(nonatomic, readonly) SCNMaterialProperty *transparent;

透明效果。
這個屬性可以選擇性地讓部分貼圖透明蒙兰×琢觯可以使用transparency屬性來調(diào)整整體的透明度,或者使用SCNNodeopacity屬性來調(diào)整節(jié)點上的所有內(nèi)容搜变。
默認(rèn)情況下為黑色采缚,表示完全不透明。將transparent設(shè)置成任何純色挠他,會根據(jù)顏色的不透明度來整體淡化貼圖扳抽。想要讓部分貼圖透明,需要設(shè)置成圖片或其他紋理圖,然后根據(jù)alpha通道調(diào)整透明或不透明的區(qū)域贸呢。
如下圖:

Adding a transparent texture to a material

@property(nonatomic, readonly) SCNMaterialProperty *multiply;

后期效果赂苗。
在貼圖的其他視覺特性與燈光以及其他相關(guān)的場景元素結(jié)合之后,將每個渲染的像素與multiply屬性提供的顏色相乘贮尉,渲染出最終的效果∑友兀可以使用
默認(rèn)情況下是白色猜谚,表示沒有后期效果。
如下圖:

Adding a multiply color to a material

以上赌渣,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;
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是不透明绣硝。
SCNTransparencyModeDualLayerSCNTransparencyModeSingleLayer也是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自己也并沒有理解透徹娇昙,如有理解不正確的地方尺迂,感謝斧正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市噪裕,隨后出現(xiàn)的幾起案子蹲盘,更是在濱河造成了極大的恐慌,老刑警劉巖膳音,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件召衔,死亡現(xiàn)場離奇詭異,居然都是意外死亡祭陷,警方通過查閱死者的電腦和手機苍凛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兵志,“玉大人醇蝴,你說我怎么就攤上這事∠牒保” “怎么了悠栓?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長按价。 經(jīng)常有香客問我惭适,道長,這世上最難降的妖魔是什么楼镐? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任癞志,我火速辦了婚禮,結(jié)果婚禮上框产,老公的妹妹穿的比我還像新娘凄杯。我一直安慰自己,他們只是感情好秉宿,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布盾舌。 她就那樣靜靜地躺著,像睡著了一般蘸鲸。 火紅的嫁衣襯著肌膚如雪妖谴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天酌摇,我揣著相機與錄音膝舅,去河邊找鬼。 笑死窑多,一個胖子當(dāng)著我的面吹牛仍稀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埂息,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼技潘,長吁一口氣:“原來是場噩夢啊……” “哼遥巴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起享幽,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤铲掐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后值桩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摆霉,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年奔坟,在試婚紗的時候發(fā)現(xiàn)自己被綠了携栋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡咳秉,死狀恐怖婉支,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澜建,我是刑警寧澤磅摹,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站霎奢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饼灿。R本人自食惡果不足惜幕侠,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碍彭。 院中可真熱鬧晤硕,春花似錦、人聲如沸庇忌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皆疹。三九已至疏橄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間略就,已是汗流浹背捎迫。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留表牢,地道東北人窄绒。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像崔兴,于是被迫代替她去往敵國和親彰导。 傳聞我的和親對象是個殘疾皇子蛔翅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容