Je n'en suis pas si sûr, le GPU est 3* plus rapide que le CPU.Citation:
Tout autre méthode sont bonne pour la poubelle.
Et je n'ai pas envie de passer par des méthodes trop complexe.
Je préfère encore stocker les valeurs z et alpha du fragment courant et du fragment le plus proche de la caméra dans une texture, et faire une comparaison.
Mais tu as raison, il y avait une erreur, j'ai donc changé mes shaders comme ceci :
Code:
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 const std::string depthGenFragShader = "#version 130 \n" "uniform sampler2D depthBuffer;" "uniform sampler2D heightMap;" "uniform sampler2D texture;" "uniform vec3 resolution;" "uniform float haveTexture;" "uniform float maxM;" "uniform float maxP;" "uniform float m;" "uniform float p;" "in mat4 projMat;" "void main () {" "vec2 position = ( gl_FragCoord.xy / resolution.xy );" "vec4 color = texture2D(depthBuffer, position);" "vec4 pixel = (haveTexture==1) ? gl_Color * texture2D(texture, gl_TexCoord[0].xy) : gl_Color;" "float z = (gl_FragCoord.w != 1.f) ? (inverse(projMat) * vec4(0, 0, 0, gl_FragCoord.w)).w : gl_FragCoord.z;" "float intensity = (maxM != 0) ? m / maxM : 0.f;" "float power = (maxP != 0) ? p / maxP : 0.f;" "if (z >= color.z && pixel.a >= color.a) {" "gl_FragColor = vec4(z, pixel.a, z, pixel.a);" "} else {" "gl_FragColor = vec4(z, pixel.a, color.b, color.a);" "}" "}"; const std::string frameBufferGenFragShader = "#version 130 \n" "uniform sampler2D depthBuffer;" "uniform sampler2D frameBuffer;" "uniform sampler2D texture;" "uniform vec3 resolution;" "uniform float haveTexture;" "in mat4 projMat;" "void main () {" "vec2 position = ( gl_FragCoord.xy / resolution.xy );" "vec4 depth = texture2D(depthBuffer, position);" "vec4 color = texture2D(frameBuffer, position);" "vec4 pixel = (haveTexture==1) ? gl_Color * texture2D(texture, gl_TexCoord[0].xy) : gl_Color;" "float z = (gl_FragCoord.w != 1.f) ? (inverse(projMat) * vec4(0, 0, 0, gl_FragCoord.w)).w : gl_FragCoord.z;" "if (z >= depth.r) {" "gl_FragColor = pixel * pixel.a + color * (1 - pixel.a) /*pixel*/;" "gl_FragColor.a = color.a + pixel.a * (1 - color.a);" "} else {" "gl_FragColor = color * depth.g + pixel * (1 - depth.g) /*color*/;" "gl_FragColor.a = pixel.a + color.a * (1 - pixel.a);" "}" "}";
J'ai essayé d'enlever les if mais, ça ne change pas le FPS, ce qui bouffe beaucoup le FPS ce sont surtout les méthodes qui effectuent tout les calculs pour recherché se qui se trouve dans le champ de vision de la caméra, ainsi que la physique, d'ailleurs en général, si je le peux, je fais ça côté serveur et je laisse le client géré juste l'affichage de ce que le serveur lui envoie.