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

标签 java libgdx glsl shader effect

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

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

问题是它很慢。本来想用在手机上的,但是觉得没机会了。另一个问题是,从顶点到片段我不能发送很多位置(在本例中为 30 个位置)。当着色器编译更多位置时,它会报告“没有足够的空间用于定义的变量”。 为了渲染,我使用了 Libgdx 框架。

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

glowy dots

顶点:

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. 为每个 Spark 渲染一个大的白色模糊圆圈(预制)
    • 可选择应用模糊着色器以使其更平滑,可能不需要
  2. 使用结果作为 mask ,根据值渲染蓝色色调
    • 深灰色到灰色变成深蓝色到亮蓝色
    • 灰色到白色变成亮蓝色到饱和蓝色
  3. 在顶部渲染每个 Spark

关于java - 关于如何在没有 GLSL 的情况下实现这种效果的任何想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803018/

相关文章:

java - Spring 应用程序上下文的 Web 控制台

JavaFX StackPane 不显示方法内部的对象

java - Libgdx 3D 纹理透明度

android - 如何使用 Android 和 OpenGL ES 2.0 在正方形上绘制文本

java - 如何修复 GLSL 1.5 版和 ES 3.0 版之间的兼容性问题

java - primefaces 折线图的问题

Java Mission Control - 访问被拒绝连接到远程

java - libGDX 将我的系统从像素更改为单位

java - 如何在 libgdx 中制作固定 Sprite (不随我的相机移动)?

opengl-es - 如何将 int 转换为在 GLSL(WebGL)中 float ?