剪影轮廓着色器

时间:2013-04-23 10:17:49

标签: unity3d shader outline cg

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

enter image description here

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

它可以在项目中找到 Quality Settings