原文地址:Docs ? Shading ? Your first shader ? Your first Spatial shader: part 2
從高層次來(lái)看春畔,Godot所作的就是提供用戶一些可以選擇性設(shè)置的參數(shù)屬性(比如:AO
,SSS_Strength
,RIM
等)鸟召。這些參數(shù)屬性分別對(duì)應(yīng)著不同復(fù)雜的效果(環(huán)境光遮擋Ambient Occlusion
,次表面散射SubSurface Scattering
,邊緣光Rim Lighting
等)。如果這些參數(shù)屬性不設(shè)置的話,對(duì)應(yīng)的代碼會(huì)在編譯前被剔除,使得shader不會(huì)對(duì)不需要的效果付出運(yùn)算代價(jià)凑耻。這種機(jī)制使用戶很容易實(shí)現(xiàn)復(fù)雜的PBR shader,而不需要編寫(xiě)復(fù)雜的shader代碼柠贤。當(dāng)然香浩,Godot也允許你完全忽略掉這些參數(shù),編寫(xiě)完全自定義的shader臼勉。
完整的參數(shù)屬性列表請(qǐng)參看Spatial shaders邻吭。
頂點(diǎn)函數(shù)(vertex function
)和片元函數(shù)(fragment function
)的區(qū)別之一是:頂點(diǎn)函數(shù)對(duì)每一個(gè)頂點(diǎn)運(yùn)算,并設(shè)置VERTEX
(position)和NORMAL
等屬性坚俗,而片元函數(shù)對(duì)每個(gè)像素運(yùn)算镜盯,并設(shè)置模型的ALBEDO
(color)屬性。
你的第一個(gè)3D片元函數(shù)
正如本教程之前章節(jié)提到的猖败。Godot中片元函數(shù)的標(biāo)準(zhǔn)用法是設(shè)置不同的材質(zhì)屬性速缆,然后讓Godot完成剩余的工作。為了提供更好的靈活性恩闻,Godot還提供一種叫做渲染模式(render node
)的東西艺糜。渲染模式需要設(shè)置在shader的頂部,直接寫(xiě)在shader_type
的下面幢尚,渲染模式將指定shader擁有哪些內(nèi)置功能破停。
例如,如果不希望某個(gè)對(duì)象被光照影響尉剩,可將它的渲染模式設(shè)為unshaded
:
render_mode unshaded;
你也可以同時(shí)添加多個(gè)渲染模式真慢。比如,如果像使用卡通著色來(lái)代替更具真實(shí)感的PBR著色理茎,可以將漫反射模式(diffuse mode
)和鏡面反射模式(specular mode
)設(shè)置為卡通風(fēng):
render_mode diffuse_toon, specular_toon;
這個(gè)內(nèi)置功能模型機(jī)制使你可以通過(guò)改變幾個(gè)參數(shù)來(lái)實(shí)現(xiàn)復(fù)雜的shader黑界。
完整的渲染模式列表請(qǐng)參看Spatial shaders管嬉。
在教程的這個(gè)部分,我們將手把手教你將上個(gè)部分的那個(gè)凹凸不平的地形變成一個(gè)海洋朗鸠。
首先讓我們通過(guò)設(shè)置ALBEDO
屬性來(lái)改變水的顏色蚯撩。
讓我們把它變成美麗的藍(lán)色。
void fragment() {
ALBEDO = vec3(0.1, 0.3, 0.5);
}
我們把水面設(shè)置為非常暗的藍(lán)色烛占,因?yàn)樗娼^大多數(shù)的藍(lán)色將來(lái)源于天空的折射胎挎。
Godot的PBR模型依賴于兩個(gè)主要參數(shù):金屬度(METALLIC
)和粗糙度(ROUGHNESS
)。
ROUGHNESS
決定材質(zhì)的平滑/粗糙程度忆家。一個(gè)較低的ROUGHNESS
會(huì)讓材質(zhì)看起來(lái)像發(fā)亮的塑料犹菇,而一個(gè)較高的ROUGHNESS
會(huì)讓材質(zhì)看起來(lái)顏色更統(tǒng)一。
METALLIC
決定材質(zhì)近似于金屬的程度弦赖。它的值域在0和1之間项栏∑直妫可以把METALLIC
想象為(鏡面)反射(reflection
)和漫反射(ALBEDO
)色之間的平衡蹬竖。一個(gè)很高的METALLIC
幾乎可以使ALBEDO
被忽略,看起來(lái)就像環(huán)境(譯者注:原詞為sky流酬,翻譯成環(huán)境貌似更好理解一些)中的一面鏡子币厕,而一個(gè)很低的METALLIC
會(huì)對(duì)環(huán)境色和漫反射色有更均衡的表現(xiàn)。
ROUGHNESS
從左到右從0增長(zhǎng)到1芽腾;METALLIC
從上到下從0增長(zhǎng)到1旦装。
注意:對(duì)于標(biāo)準(zhǔn)的PBR著色,
METALLIC
應(yīng)該接近0或1摊滔,只有當(dāng)混合材質(zhì)的時(shí)候才把值設(shè)在它們之間阴绢。
水并不是金屬,所以我們將它的METALLIC
屬性設(shè)為0.0
艰躺。但是水是高度反射的呻袭,所以我們將它的ROUGHNESS
設(shè)為非常低。
void fragment() {
METALLIC = 0.0;
ROUGHNESS = 0.01;
ALBEDO = vec3(0.1, 0.3, 0.5);
}