因为我是一个完全没有着色器的菜鸟,所以在尝试使用 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 元素的想法,我也会欢迎 :)