关于如何在没有 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,这将非常棘手,但如果问题是它太慢,也许以下方法会有所帮助:
- 为每个火花渲染一个大的白色模糊圆圈(预制)
- 可选择应用模糊着色器使其更平滑,可能不需要
- 使用结果作为遮罩,根据值渲染蓝色色调
- 深灰色到灰色变成深蓝色到亮蓝色
- 灰色到白色变成亮蓝色到饱和蓝色
- 在顶部渲染每个火花
除了使用 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,这将非常棘手,但如果问题是它太慢,也许以下方法会有所帮助:
- 为每个火花渲染一个大的白色模糊圆圈(预制)
- 可选择应用模糊着色器使其更平滑,可能不需要
- 使用结果作为遮罩,根据值渲染蓝色色调
- 深灰色到灰色变成深蓝色到亮蓝色
- 灰色到白色变成亮蓝色到饱和蓝色
- 在顶部渲染每个火花