3D打印机shader特效

2016年11月23日 17:16 0 点赞 0 评论 更新于 2017-05-08 17:19

介绍

这篇教程的第一部分将展示如何使用无灯光模型(如下图所示)来渲染部分物体。不过,要完全实现《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) {
// 用实体颜色渲染
}

作者信息

孟子菇凉

孟子菇凉

共发布了 1189 篇文章