关于如何在没有 GLSL 的情况下实现这种效果的任何想法

Any idea on how to achieve this effect without GLSL

除了使用 GLSL 着色器之外,您是否知道如何通过其他方式实现这种 2D 效果?这样的发光效果,可以用纹理来完成,但是如何在它们周围做这样的动态气泡?

在这种情况下,气泡中的每个对象都会到达某个目的地。然后我将它们的位置发送到顶点着色器,然后发送到片段着色器。在片段着色器中会有一些计算来实现这个效果。我在大小为 1280x720 的背景纹理上绘制着色器。

问题是速度很慢。本来想用在手机上的,但是觉得没机会了。另一个问题是,从顶点到片段我不能发送很多位置(在本例中为 30 个位置)。当着色器编译更多位置时,它报告 "Not enough space for Defined varyings"。 为了呈现我使用 Libgdx 框架。

欢迎任何帮助。即使是为了达到类似的效果。 我在这里附上图片,说明它应该是什么样子。和着色器代码。

顶点:

attribute vec4 a_position;
uniform mat4 u_worldView;
uniform float u_xPos[30];
uniform float u_yPos[30];
uniform float u_size;

varying float xPos[30];
varying float yPos[30];
varying float size;
void main()
{
    gl_Position = u_worldView * a_position;
    size = u_size;

    int NN = int(u_size);

    for(int i=0; i<NN; ++i){
    xPos[i] = u_xPos[i];
    yPos[i] = u_yPos[i];
}

片段:

varying float xPos[30];
varying float yPos[30];
varying float size;

void main( void ) {
    float rad = 4.0;
    float dist = 0.0;
    vec2 pos = vec2(0.0,0.0);
    vec3 color = vec3(0.1);
    vec2 pixel = gl_FragCoord.xy;
    vec3 c = vec3(0.53, 0.05, 0.1);

    float xx[30]= xPos;
    float yy[30]= yPos;

    int NN = int(size);
    for(int i=0; i<NN; ++i){
        pos = vec2(xx[i] , yy[i]) - pixel;
        dist += rad / length(pos);
    }

    color = c.yzx*dist;
    gl_FragColor = vec4(color, 1.0);
}

如果没有 GLSL,这将非常棘手,但如果问题是它太慢,也许以下方法会有所帮助:

  1. 为每个火花渲染一个大的白色模糊圆圈(预制)
    • 可选择应用模糊着色器使其更平滑,可能不需要
  2. 使用结果作为遮罩,根据值渲染蓝色色调
    • 深灰色到灰色变成深蓝色到亮蓝色
    • 灰色到白色变成亮蓝色到饱和蓝色
  3. 在顶部渲染每个火花