如何减少轮廓发光效果中的锯齿?


42

我正在尝试在《 Left 4 Dead》游戏中复制发光的轮廓效果。即使对象被遮挡,该效果也会使对象轮廓发光。这是效果的屏幕截图:

在此处输入图片说明

我可以在基于OpenGL的程序中复制这种效果。这是我目前正在做的:

  • 创建颜色和深度纹理,其大小是屏幕尺寸的一半,用于渲染发光的对象
  • 清除发光颜色/深度纹理。颜色清除为黑色。
  • 对于每个发光对象,将其渲染为单色的发光纹理
  • 对发光纹理执行可分离的高斯模糊
  • 正常渲染全分辨率场景
  • 将辉光纹理与正常场景相加,但是使用辉光深度纹理可以遮盖对象,仅留下模糊的轮廓。

这是我的方法的屏幕截图:

在此处输入图片说明

这是将发光纹理与场景结合在一起的片段着色器:

uniform sampler2D glowColorTex;
uniform sampler2D glowDepthTex;
uniform sampler2D sceneColorTex;
void main()
{
    vec2 uv = gl_TexCoord[0].st;

    vec4 color = texture2D( sceneColorTex, uv);

    float depth = texture2D( glowDepthTex, uv).r;
    if(depth == 1.0) {
        color += 2.0 * texture2D( glowColorTex, uv);
    }

    gl_FragColor = color;
}

如您所见,它似乎在大多数情况下都起作用,但是轮廓上的别名确实很糟糕。

有人对平滑轮廓的内部边缘有什么建议吗?

我应该对每个像素的相邻深度值进行采样并根据等于1.0的深度值的数量缩放辉光吗?

还是有更好的方法可以产生更平滑的结果?

Answers:


13

也许可以代替使用低分辨率深度缓冲区来检查它,而可以使用模板测试。渲染普通场景时,只需渲染应该发光到模板缓冲区中的对象(我认为无需进行深度测试),然后混合完整的发光纹理,但将模板测试配置为仅通过模板缓冲区所在的位置未设置,因此掩盖了高分辨率对象。

这样,您可以获得原始对象的精确轮廓,而边缘的平滑只会导致近似结果,但是也许这些就足够了。


谢谢,绝对有帮助。我希望能够支持某种形式的抗锯齿的技术,但这仍然是一项重大改进。
Flashk 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.