【发布时间】:2018-08-24 01:02:36
【问题描述】:
我将元球的概念应用到我正在制作的游戏中,以表明玩家选择了几艘船,例如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) (虽然这没有意义)有点帮助,尽管它不能解决问题。
任何帮助或建议将不胜感激。
【问题讨论】:
-
使用片段着色器方法可能无法实现恒定的厚度。您可以在 CPU 上提取等值线并将该信息作为线带传递给 GPU。或者,您可以对片段着色器的结果进行基于图像的细化。不过,这可能计算量更大。
标签: graphics 2d glsl shader geometry-surface