原文地址:Docs » Shading » Your first shader » Your first Spatial shader
译者注:方便起见,将Spatial Shader意译为3D Shader
你打算开始写你的自定义3D Shader了?也许是因为你看到了网上用Shader做出来的炫酷的特效,也许是因为你发现SpatialMaterial (默认的3D材质)不能够满足你的需要。总之,你决定自己写一下Shader,那么你需要考虑一下从哪里开始。
这个教程将解释如何写一个3D Sahder并且将覆盖较之前2D Shader教程更多的知识点。
相较于2D Shader,3D Shader提供更多的内置功能。3D Shader的初衷就是让Godot提供常用的所有功能,用户只需要设置属性变量就可以了。这尤其是针对PBR(physically based rendering)工作流。
这个教程分为两个部分。第一个部分中,我们将在顶点函数中基于高度图(heightmap)的顶点置换完成一个简单的地形。第二个部分中,我们会以海洋的Shader为例,手把手教大家设置自定义材质。
注意: 这个教程需要一些前导知识比如数据类型(
vec2
,float
,sampler2D
)以及函数。如果你对这些概念有困难,建议你先阅读一下The Book of Shaders 再来完成这个教程
到哪里指定材质
在3D中,引擎使用Mesh
(网格模型,后简称网格)来绘制对象。网格是一种资源类型,用于存储几何形状(对象的形状)以及材质(颜色以及对象与光如何作用),网格通常以表面(surface)为单位。一个网格可以有很多表面也可以只有一个表面。一般来说,我们会从诸如Blender的其它软件导入网格。但是Godot也提供了一些基础几何体(PrimitiveMesh
),以供你在不借助其它软件的时候可以添加一些基础几何体。
你可以使用很多种类型的节点来绘制网格。最主要的是MeshInstance
,当然你也可以使用Particles
或者MultiMeshes
(包含一个MultiMeshInstance
)等。
一般来说,一个材质会关联网格中的一个指定的表面,但诸如MultiMeshInstance
的一些节点允许你对于某些甚至全部表面重写材质。
如果你为一个表面或者网格本身设置了一个材质,那么共享这个网格的所有MeshInstance
将共享这个材质。如果你想在多个MeshInstance
间复用一个网格,但每个MeshInstance
拥有不同的材质,那么你应该将材质设置在MeshInstance
上。
在这个教程中,我们将把材质设置在网格本身,而不是利用MeshInstance
去重写材质。