原文地址:Docs » Shading » Your first shader » Your first Spatial shader: part 2
从高层次来看,Godot所作的就是提供用户一些可以选择性设置的参数属性(比如:AO
,SSS_Strength
,RIM
等)。这些参数属性分别对应着不同复杂的效果(环境光遮挡Ambient Occlusion
,次表面散射SubSurface Scattering
,边缘光Rim Lighting
等)。如果这些参数属性不设置的话,对应的代码会在编译前被剔除,使得shader不会对不需要的效果付出运算代价。这种机制使用户很容易实现复杂的PBR shader,而不需要编写复杂的shader代码。当然,Godot也允许你完全忽略掉这些参数,编写完全自定义的shader。
完整的参数属性列表请参看Spatial shaders。
顶点函数(vertex function
)和片元函数(fragment function
)的区别之一是:顶点函数对每一个顶点运算,并设置VERTEX
(position)和NORMAL
等属性,而片元函数对每个像素运算,并设置模型的ALBEDO
(color)属性。
你的第一个3D片元函数
正如本教程之前章节提到的。Godot中片元函数的标准用法是设置不同的材质属性,然后让Godot完成剩余的工作。为了提供更好的灵活性,Godot还提供一种叫做渲染模式(render node
)的东西。渲染模式需要设置在shader的顶部,直接写在shader_type
的下面,渲染模式将指定shader拥有哪些内置功能。
例如,如果不希望某个对象被光照影响,可将它的渲染模式设为unshaded
:
render_mode unshaded;
你也可以同时添加多个渲染模式。比如,如果像使用卡通着色来代替更具真实感的PBR着色,可以将漫反射模式(diffuse mode
)和镜面反射模式(specular mode
)设置为卡通风:
render_mode diffuse_toon, specular_toon;
这个内置功能模型机制使你可以通过改变几个参数来实现复杂的shader。
完整的渲染模式列表请参看Spatial shaders。
在教程的这个部分,我们将手把手教你将上个部分的那个凹凸不平的地形变成一个海洋。
首先让我们通过设置ALBEDO
属性来改变水的颜色。
让我们把它变成美丽的蓝色。
void fragment() {
ALBEDO = vec3(0.1, 0.3, 0.5);
}
我们把水面设置为非常暗的蓝色,因为水面绝大多数的蓝色将来源于天空的折射。
Godot的PBR模型依赖于两个主要参数:金属度(METALLIC
)和粗糙度(ROUGHNESS
)。
ROUGHNESS
决定材质的平滑/粗糙程度。一个较低的ROUGHNESS
会让材质看起来像发亮的塑料,而一个较高的ROUGHNESS
会让材质看起来颜色更统一。
METALLIC
决定材质近似于金属的程度。它的值域在0和1之间。可以把METALLIC
想象为(镜面)反射(reflection
)和漫反射(ALBEDO
)色之间的平衡。一个很高的METALLIC
几乎可以使ALBEDO
被忽略,看起来就像环境(译者注:原词为sky,翻译成环境貌似更好理解一些)中的一面镜子,而一个很低的METALLIC
会对环境色和漫反射色有更均衡的表现。
ROUGHNESS
从左到右从0增长到1;METALLIC
从上到下从0增长到1。
注意:对于标准的PBR着色,
METALLIC
应该接近0或1,只有当混合材质的时候才把值设在它们之间。
水并不是金属,所以我们将它的METALLIC
属性设为0.0
。但是水是高度反射的,所以我们将它的ROUGHNESS
设为非常低。
void fragment() {
METALLIC = 0.0;
ROUGHNESS = 0.01;
ALBEDO = vec3(0.1, 0.3, 0.5);
}