J'essaie d'implémenter un moteur de lumière 2D simple sur mon jeu basé sur libGDX. L'idée est de créer ce moteur léger sans shaders. Je ne prévois pas d'ombre pour le moment. J'ai réussi à rendre une carte de lumière avec des triangles et des gradients, mais le problème est que lorsque plusieurs sources de lumière chevauche je suis arrivé un peu artefact comme dans cette image:artefact de carte diffuse de lumière 2D
la source de lumière jaune est producting sombre frontière lors du chevauchement des autres sources de lumière.
J'utilise la fonction de mélange ci-dessous pour rendre les lumières:
Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_ONE);
est-il un moyen de se débarrasser de cette bordure noire?
Le dégradé passe de l'opacité totale du jaune au noir. Comme GL_ONE
est supposé être additif, les couleurs devraient seulement être plus claires à droite?
Mise à jour 1:
utilisant shaders comme expliqué par Nico Schertler est certainement mieux, mais il y a encore quelques paramètres que je ne suis pas sûr.
ici est le fragment shader je suis venu avec
void main() {
float intensity = 0.02;
vec2 pos = vPosition;
float dist = distance(pos, u_origin)/u_radius;
vec4 color = vec4(intensity * (vColor.rgb/((dist * dist) + 0.01)), 1);
gl_FragColor = color;
}
le problème est moi qui ne suis pas sûr au sujet des constantes intensity = 0.02
et 0.01
j'ai ajoutés à la fonction pour le faire paraître belle . De plus, la variable radius est maintenant le maximum entre la hauteur et la largeur de l'écran.
Mise à jour 2:
J'ai finalement opté pour l'équation suivante:
void main() {
float dist = distance(vPosition, u_origin)/u_radius;
vec4 color = vec4((vColor.rgb)/(pow(dist, 2) + 0.01), vColor.a);
gl_FragColor = color;
}
ensuite combiné avec une carte d'occlusion (pour assombrir les endroits non éclairés) basé sur la même équation. Voici le résultat final:
Cette bande sombre est une illusion. Vous êtes invités à vérifier les valeurs avec n'importe quel éditeur graphique et voir qu'ils ne sont pas plus sombres :) actuellement, il semble que vous n'êtes pas rendu avec sRGB mais, vous devriez. D'autres choses, comme l'atténuation quadratique, vont probablement masquer cela. – ybungalobill