【发布时间】:2014-01-05 16:34:11
【问题描述】:
我在我的 Android (libGDX) 应用程序中使用了等离子着色器,我从这里找到了它:
http://www.bidouille.org/prog/plasma
这是我的着色器(稍作修改):
#define LOWP lowp
precision mediump float;
#else
define LOWP
#endif
#define PI 3.1415926535897932384626433832795
uniform float time;
uniform float alpha;
uniform vec2 scale;
void main() {
float v = 0.0;
vec2 c = gl_FragCoord.xy * scale - scale/2.0;
v += sin((c.x+time));
v += sin((c.y+time)/2.0);
v += sin((c.x+c.y+time)/2.0);
c += scale/2.0 * vec2(sin(time/3.0), cos(time/2.0));
v += sin(sqrt(c.x*c.x+c.y*c.y+1.0)+time);
v = v/2.0;
vec3 col = vec3(1, sin(PI*v), cos(PI*v));
gl_FragColor = vec4(col *.5 + .5, alpha);
}
我通过 ImmediateModeRendererGL20 将其渲染为四边形。
但是,对于我的需求来说,它似乎太慢了。我试图用着色器填充我的 Nexus 7(第一代)上的几乎整个屏幕,但我什至无法接近 60 FPS。
这真的是我第一次真正进入 GLSL 世界,我不知道这些东西通常应该如何执行!
我想知道如何优化这个着色器?我真的不在乎图像质量,我可以牺牲它。我得出的结论是,某种查找表可能是我所追求的和/或降低着色器的分辨率..?但我不太确定从哪里开始。我对 GLSL 还很陌生,“低级”编程从来都不是我真正喜欢的,但我渴望至少尝试一下!
【问题讨论】:
-
不要吹毛求疵,但您列出的着色器在开头缺少至少一行。正如现在显示的那样,您有一个无与伦比的
#if/#else/#endif预处理器分支。 -
另外,
gl_FragCoord.xy被插入到屏幕对齐的四边形中...如果您真的不关心图像质量,您实际上可以将四边形拆分为一个一堆瓦片并在顶点着色器中评估它。图像质量和处理时间将随着您决定使用的图块数量而增加。 -
请同时提供顶点和片段着色器。
标签: android opengl-es opengl-es-2.0 glsl shader