Java GLSL平滑边界着色器

Java GLSL平滑边界着色器,java,opengl,libgdx,glsl,shader,Java,Opengl,Libgdx,Glsl,Shader,我正在寻找一个特定的着色器,或者寻找另一种方法来获得期望的结果 图中显示了所需结果(左侧输入,右侧输出): 我已经尝试过修改一个简单的渐晕着色器: varying vec4 v_color; varying vec2 v_texCoord0; uniform vec2 u_resolution; uniform sampler2D u_sampler2D; const float outerRadius = .65, innerRadius = .4, intensity = .6; v

我正在寻找一个特定的着色器,或者寻找另一种方法来获得期望的结果

图中显示了所需结果(左侧输入,右侧输出):

我已经尝试过修改一个简单的渐晕着色器:

varying vec4 v_color;
varying vec2 v_texCoord0;

uniform vec2 u_resolution;
uniform sampler2D u_sampler2D;

const float outerRadius = .65, innerRadius = .4, intensity = .6;

void main() {
    vec4 color = texture2D(u_sampler2D, v_texCoord0) * v_color;

    vec2 relativePosition = gl_FragCoord.xy / u_resolution - .5;
    float len = length(relativePosition);
    float vignette = smoothstep(outerRadius, innerRadius, len);
    color.rgb = mix(color.rgb, color.rgb * vignette, intensity);

    gl_FragColor = color;
}
我认为,当我向您展示我修改过的代码时,这会让您感到困惑而不是帮助。我试图模仿与渐晕着色器相同的概念:使用岛的边界框,在screenCoords中变换x、y、宽度和高度,并获得fragCoords到岛中心的相对位置(正常渐晕将使用屏幕分辨率而不是岛“分辨率”)。然后我想反转渐晕效果(内部黑暗,外部淡出)

不幸的是,它不起作用,我认为整个方法应该改变

第二个想法是在我的地图上的所有岛屿上放置一个暗光。(带Box2Lights) 但这可能有点贵


还有其他想法吗?

首先是如何创建/渲染输入图像的?输入是通过过程生成()创建的。每个顶点存储在PolygonSprite(来自libgdx)中,并由合适的SpriteBatch(PolygonSpriteBatch)渲染。绿色平台被分离并重新红色(这些是普通精灵)。这种孤岛的填充是一个多边形。添加与边缘的预计算属性距离,并将其用作模糊/变暗强度。否则,您需要投射光线并在着色器中检测该距离,该距离很慢(类似于)…您可以尝试使用侵蚀过滤器()。将对象渲染为黑白纹理。然后应用腐蚀过滤器。可以使用结果遮罩将黑暗应用于结果帧。它需要额外的渲染过程,可能会有点慢。感谢Spektre和Unick的建议。我将对两者进行评估:)