3D打印机shader特效
介绍
这篇教程的第一部分将展示如何使用无灯光模型(如下图所示)来渲染部分物体。不过,要完全实现《Astroneer》中那种漂亮的风格,还需要完成几件事。
切几何体
在我们的着色器中,最简单的效果是停止绘制几何体的上半部分。可以使用关键字 discard
来任意阻止一个像素被绘制到着色器中。我们利用它来确保只绘制模型顶部的边缘,示例代码如下:
void surf (Input IN, inout SurfaceOutputStandard o)
{
if (IN.worldPos.y > _ConstructY + _ConstructGap)
discard;
// ...
}
需要注意的是,这种做法可能会在集合形状中留下“洞”。因此,应该禁用面剔除,这样物体的背面也能被绘制。可以通过以下代码实现:
Cull Off
营造实心错觉
目前,这个物体看起来是中空的。实际上,所有3D模型本质上都是中空的。但我们希望让这个物体给人一种实心的错觉,这可以通过用同样的无灯光着色器为物体内部上色来轻松实现。物体仍然是中空的,但看起来会像实心的。
为了达到这一效果,我们需要处理背对镜头的三角形。如果对向量代数不太熟悉,这可能看起来是一个复杂的条件,但实际上可以简单地用点积来完成。两个向量之间的点积表示它们的“对齐”程度,这直接与它们之间的角度相关。当两个向量之间的点积为负数时,说明它们之间的角度大于90度。
我们可以使用相机视角方向(在表面着色器中为 viewDir
)与三角形法向量的点积来测试三角形的朝向。如果点积为负数,说明这个三角形不是面对镜头的,我们能看到它的背面,此时用实体的颜色来渲染它。示例代码片段如下(这里假设已有相关变量定义):
// 假设已有 viewDir 和 normal 向量的定义
float dotProduct = dot(viewDir, normal);
if (dotProduct < 0) {
// 用实体颜色渲染
}