私はシェーダーの完全な初心者なので、基本的に画面を 2D の黒いテクスチャで覆い、明るい領域がある透明な穴のある 2D 照明システムを動作させようとしているときに、いくつかの問題が発生しました。
テクスチャを 1 つしか使用していないので、フラグメント シェーダーでこれを行う必要があると思いますよね?
フラグメント シェーダー:
#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);
}
問題は、パフォーマンスが本当にひどいことです (2 つのライトがあり、画面上に他に何もない状態で 60fps で実行することはできません)。改善するための提案や、この問題に対処するための別の方法はありますか?
ちなみに、私はcocos2d-xからこれをやっているので、誰かがcocos2d要素を使用するアイデアを持っていれば、それも歓迎されます:)