剪影轮廓着色器

问题描述 投票:4回答:2

我知道这是一个记录很好的主题,但我仍然有一些问题。我制作了一个轮廓的轮廓但是加倍了网格。我有一个很好的fps,但轮廓太苛刻,我希望它渐进淡出。结果如下:

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

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

unity3d shader outline cg
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


0
投票

如何检查抗锯齿是否有效?

它可以在项目Quality Settings中找到。

© www.soinside.com 2019 - 2024. All rights reserved.