unity-game-engine - 剪影轮廓着色器

标签 unity-game-engine shader outline cg

我知道这是一个有据可查的主题,但我仍然有一些问题。我制作了轮廓的轮廓,但将网格加倍。我的帧速率很好,但轮廓太粗糙,我希望它逐渐淡出。结果如下:

enter image description here

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

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

最佳答案

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

您可以选择的一个稍微有点黑客的选项是根据菲涅尔系数淡出轮廓。基本上,您可以像这样在顶点着色器中获取 View 向量:

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

关于unity-game-engine - 剪影轮廓着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16166821/

相关文章:

html - IE 中的图像超链接和轮廓。我根本不想删除轮廓

c# - 如何旋转我单击的立方体而不是所有立方体同时旋转?

ios - 使用 Storyboard自定义 Unity3D Xcode 项目

c++ - 设置基本着色器程序 - GLchar 和 file_contents 未定义?

android - 异步或在 Android 上的不同线程中编译 GLSL 着色器

opengl-es - 如何在 webgl 渲染 channel 之间传递高精度 uv 坐标?

css - 如何在 CSS 中使用原生浏览器大纲?

css - 边框上的轮廓 [Chrome 上的行为不一致]

C# - 更改函数内的数组值

iphone - vuforia 和 uinavigationcontroller