Bonjour,
tout d'abord désolée pour ce titre étrange mais je ne savais pas comment résumer mon problème. Je vais tâcher de l'expliquer mieux :
J'ai un objet que je souhaite dessiner sur un fond transparent, le but étant de faire du render-to-texture, puis de générer un flou gaussien sur cette texture via les shaders, et enfin faire un blending avec un quad texturé en background (j'espère que j'ai été claire )
En gros je veux flouter un objet, puis le superposer à une image.
Le problème, c'est que le background sort bien transparent, mais l'objet aussi ! J'ai testé la valeur alpha de chacun des pixels, et je me retrouve avec :
- 0 quand c'est le le fond (jusque là, logique...)
- 85 ou 170 quand c'est mon objet (et là, c'est le drame... il devrait être opaque ! )
Etant donné que les objets sont chargés depuis des fichiers .obj, j'ai même tenté de forcer l'opacité à 1 à la lecture du fichier.... voilà le morceau de code que j'utilise :
Ah oui, petite précision, je suis en Java et je bosse donc avec JOGL, mais ça ne fait pas grand changement...
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 gl.glPushAttrib(0xffffffff); gl.glClearColor(0, 0, 0, 0); gl.glViewport(0, 0, _width * 2, _height * 2); gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, _frameBuffer.get(0)); gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); gl.glPushMatrix(); gl.glTranslated(0, 0, - _position); gl.glRotated(_rotaX, 1, 0, 0); gl.glRotated(_rotaY, 0, 1, 0); gl.glRotated(_rotaZ, 0, 0, 1); gl.glScaled(_scale, _scale, _scale); gl.glScaled(2 / _norm.max(), 2 / _norm.max(), 2 / _norm.max()); gl.glTranslated(-_centre.x, -_centre.y, -_centre.z); try { gl.glCallList(glListId); } catch (RuntimeException e) { e.printStackTrace(); } gl.glPopMatrix(); if(i == 0) { BufferedImage img = screenShot(gl, 0, 0, _width, _height); try { ImageIO.write(img, "png", new File("/elo/test.png")); } catch (IOException e) { e.printStackTrace(); } } gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0); // unbind gl.glPopAttrib();
Et ma fonction sur laquelle je teste les valeurs alpha :
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 public BufferedImage screenShot(GL2 gl, int startX, int startY, int width2, int height2) { int width = width2 * 2; int height = height2 * 2; gl.glReadBuffer(GL2.GL_FRONT); ByteBuffer buffer = ByteBuffer.allocateDirect((width * height * 4)); gl.glReadPixels(startX, startY, width, height, GL2.GL_RGBA, GL2.GL_UNSIGNED_BYTE, buffer); BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int i = (x + ( width * y)) * 4; int r = buffer.get(i) & 0xff; int g = buffer.get(i + 1) & 0xff ; int b = buffer.get(i + 2) & 0xff ; int a = buffer.get(i + 3) & 0xff; if(r > 0) image.setRGB(x, height - (y + 1), ( a << 24) | (r << 16) | (g << 8) |b ); } } return image; }
J'espère vraiment que quelqu'un pourra m'aiguiller....
Et désolée pour le code un peu sale, 15 jours que je suis là dessus je n'en peux plus de faire des tests ...!!
Merci d'avance.
Partager