4

我知道这是一个非常有据可查的主题,但我仍然有一些问题。我为轮廓制作了轮廓,但将网格加倍。我的 fps 不错,但轮廓太刺眼,我希望它逐渐淡出。结果如下:

在此处输入图像描述

它是一个两遍着色器,一个用于以粉红色渲染人,另一个用于渲染具有纹理的人。

我正在考虑在轮廓上应用高斯模糊,但我没有任何结果......有什么想法吗?提前致谢。

4

2 回答 2

1

高斯模糊之类的问题在于,它需要了解之前渲染的相邻像素的颜色……而在着色器中,您没有(充其量可以对纹理中的相邻像素进行采样)。大多数制作此效果的游戏会将所有轮廓对象渲染到单独的缓冲区,对其执行一些后期处理,然后将其叠加到屏幕上。

您可以选择的一个稍微有点骇人听闻的选择是根据菲涅耳因子淡出轮廓。基本上,您可以像这样在顶点着色器中获取视图向量:

float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
float3 viewDir = _WorldSpaceCameraPos.xyz - worldPos;

然后你在片段着色器中得到它们之间的点积,如下所示:

half NdotV = saturate(dot(IN.normal, IN.viewDir));

然后你有一个从 0 到 1 的值,具体取决于法线朝向相机的程度。您可以使用它来掩盖轮廓的 alpha:

col.a *= sqrt(NdotV); // Square root for more dramatic effect

我还没有尝试过,但它可能值得一试。请记住设置正确的混合和渲染队列。

编辑:您还可以查看此项目:

https://github.com/cakeslice/Outline-Effect

于 2019-03-14T20:06:41.707 回答
0

如何检查抗锯齿是否处于活动状态?

它可以在项目 质量设置中找到。

于 2013-04-30T12:02:46.920 回答