因为我是着色器的完全菜鸟,所以我在尝试使用 2D 照明系统时遇到了一些问题,该系统基本上用 2D 黑色纹理覆盖屏幕,在亮区所在的位置有透明孔。
因为我只使用一个纹理,所以我想我必须在片段着色器中执行此操作,对吗?
片段着色器:
#ifdef GL_ES
precision mediump float;
#endif
// Texture, coordinates and size
uniform sampler2D u_texture;
varying vec2 v_texCoord;
uniform vec2 textureSize;
uniform int lightCount;
struct LightSource
{
vec2 position;
float radius;
float strength;
};
uniform LightSource lights[10];
void main()
{
float alpha = 1.0;
vec2 pos = vec2(v_texCoord.x * textureSize.x, v_texCoord.y * textureSize.y);
int i;
for (i = 0; i < lightCount; i++)
{
LightSource source = lights[i];
float distance = distance(source.position, pos);
if (distance < source.radius)
{
alpha -= mix(source.strength, 0.0, distance/source.radius);
}
}
gl_FragColor = vec4(0.0, 0.0, 0.0, alpha);
}
问题是性能真的很糟糕(不能以 60fps 的速度运行,有 2 个灯并且屏幕上没有其他任何东西),有什么建议可以让它变得更好,甚至可以用不同的方法来解决这个问题?
顺便说一下,我是在 cocos2d-x 上做的,所以如果有人有任何使用 cocos2d 元素的想法,也将受到欢迎:)
最佳答案
我完全同意蒂姆。如果你想提高总速度,你必须避免 for 循环。我建议您,如果灯光数组大小始终为 10,则将循环语句与循环内容的 10 个拷贝交换。您应该知道,您在循环语句中声明的任何变量都将在循环结束时被释放!所以将循环分成十个部分是个好主意(丑陋,但这是一个老派的把戏;))))
此外,我还建议您在每个语句中都添加一些 println,以查看哪些指令在乱用。我敢打赌混合操作是罪魁祸首。我对 cocos2d 一无所知,但是,可以在过程结束时进行独特的混合调用,并总结距离和优势吗?似乎在某些时候有一个相当耗费 float 的恼人操作
关于iphone - iPhone 中 GLSL ES 2.0 上来自多个点源的 2D 照明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285565/