使用2D Metaball绘制具有恒定厚度的轮廓

时间:2018-08-22 03:31:26

标签: graphics 2d glsl shader geometry-surface

我将metaball的概念应用到我正在制作的游戏中,以表明玩家选择了几艘战舰,例如http://prntscr.com/klgktf

但是,我的目标是保持此轮廓的厚度不变,而这不是我在当前代码中得到的。

我正在使用GLSL着色器执行此操作,然后将碎片的统一位置传递给碎片着色器(u_metaballs)。

顶点着色器:

#version 120

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

片段着色器:

#version 120

uniform vec2 u_metaballs[128];

void main() {
    float intensity = 0;

    for(int i = 0; i < 128 && u_metaballs[i].x != 0; i++){
        float r = length(u_metaballs[i] - gl_FragCoord.xy);
        intensity += 1 / r;
    }

    gl_FragColor = vec4(0, 0, 0, 0);
    if(intensity > .2 && intensity < .21)
        gl_FragColor = vec4(.5, 1, .7, .2);
}

我已经尝试过使用强度范围,甚至将1 / r更改为10000 /(r ^ 4),这虽然没有解决问题,但是(虽然没有任何意义)会有所帮助。

任何帮助或建议,将不胜感激。

1 个答案:

答案 0 :(得分:2)

经过进一步的讲授,即使单次通过也是可行的...您只需计算到最近的金属球的距离,如果小于或等于边界厚度,则渲染片段,否则将其丢弃...在此示例中(假设单四边形{{ 1}}呈现在整个屏幕上):

顶点:

<-1,+1>

片段:

// Vertex
varying vec2 pos;       // fragment position in world space
void main()
    {
    pos=gl_Vertex.xy;
    gl_Position=ftransform();
    }

预览:

preview