Bonjour à tous,
J’essaie depuis quelques heures maintenant de reproduire un effet de lumière réaliste. Pour cela j'utilise une liste de lumières qui possèdent des coordonnées une intensité une couleur et un rayon. J'ai un shader GLSL fonctionnel qui me génère un halo de lumière autour de chaque lumières.
Ce process tourne très bien sur un petit projet avec rien que ça, mais maintenant j’essaie de l'intégrer a un plus gros projet qui contient un système de carte, d'entités ect...
Je fais donc des tests en essayant de rendre une texture en dessous de mes lumières. L'objectif est que l'image soit complètement noire sauf autour de la lumière. Par exemple pour une lumière de couleur 1,1,1,1 une intensité de 1 et un rayon de 10 positionnée au centre de l'écran, l’entièreté de l'écran devrait être noir sauf dans un cercle de rayon 10 au centre de l'image ou on verrai en fade out en partant du centre, l'image dans sa couleur originelle.
Pour cela j’essaie d'utiliser les fonctions de blending d'opengl mais l'écran reste entièrement noir, voici le code que j'utilise:
Je pense avoir mal compris la fonction blend, pour moi après le blend le rendu d'un pixel sera donc:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 private void render() { glClear(GL_COLOR_BUFFER_BIT); Texture.TEXTURE.bind(); glBegin(GL_QUADS); glColor4f(0.2f, 0.2f, 0.2f, 1); glTexCoord2d(0, 0); glVertex2f(0, 0); glTexCoord2d(1, 0); glVertex2f(width, 0); glTexCoord2d(1, 1); glVertex2f(width, height); glTexCoord2d(0, 1); glVertex2f(0, height); glEnd(); Texture.TEXTURE.unbind(); for (Light light : lights) { glUseProgram(shaderProgram); glUniform2f(glGetUniformLocation(shaderProgram, "lightLocation"), light.location.getX(), height - light.location.getY()); glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), light.red, light.green, light.blue); glEnable(GL_BLEND); //glBlendFunc(GL_ONE, GL_ONE); glBlendFunc(GL_ZERO, GL_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); glBegin(GL_QUADS); { glVertex2f(0, 0); glVertex2f(0, height); glVertex2f(width, height); glVertex2f(width, 0); } glEnd(); glDisable(GL_BLEND); glUseProgram(0); } }
0*(opacitéDeLaLumièreRendue) + opacitéDeLaLumièreRendue*(initialColor) je me trompe ?
En utilisant https://www.andersriggelsen.dk/glblendfunc.php avec ces paramètres de blending j'obtient le résultat souhaité alors je ne comprend pas pourquoi avec ce code l'écran est complètement noir
Merci d'avance !
Partager