我正在尝试在《 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的深度值的数量缩放辉光吗?
还是有更好的方法可以产生更平滑的结果?