J'ai actuellement une implémentation de travail qui me permet de coder une valeur de profondeur dans une texture à virgule flottante.Encodage de valeur de demi-flottement pour la profondeur dans le shader de fragment (WebGL 1.0)
Voici les fonctions d'encodage/Décodage:
"vec4 EncodeFloatRGBA(float v) {",
"float remainder = v;",
"vec4 res, r;",
"res[0] = floor(remainder * 255.0)/255.0;",
"remainder -= res[0];",
"res[1] = floor(remainder * 65535.0)/65535.0;",
"remainder -= res[1];",
"res[2] = floor(remainder * 16777215.0)/16777215.0;",
"remainder -= res[2];",
"res[3] = floor(remainder * 4294967295.0)/4294967295.0;",
"r[0] = clamp(floor((v) * 255.0),0.,255.);",
"r[1] = clamp(floor((v - res[0]) * 65535.0),0.,255.);",
"r[2] = clamp(floor((v - res[0] - res[1]) * 16777215.0),0.,255.);",
"r[3] = clamp(floor((v - res[0] - res[1] - res[2]) * 4294967295.0),0.,255.);",
"r[0] = r[0]/255.0;",
"r[1] = r[1]/255.0;",
"r[2] = r[2]/255.0;",
"r[3] = r[3]/255.0;",
"return r;",
"}",
"float DecodeFloatRGBA(vec4 rgba) {",
"return dot(rgba, vec4(1.0, 0.003921568627450980392156862745098, 1.5259021896696421759365224689097e-5, 5.9604648328104515558750364705942e-8));",
"}",
Voici comment je les utilise:
//Encoding in depth pass
"vec4 depth = EncodeFloatRGBA(1.0 - gl_FragCoord.z);",
"depth = floor(depth * 255.) * 0.003921568627450980392156862745098;",//simulate 32-bit encoding
"gl_FragColor = depth;",
//Decoding in color pass
"loc = vec2(gl_FragCoord.x/canvas_size.x, gl_FragCoord.y/canvas_size.y);",
"float z = DecodeFloatRGBA(EncodeFloatRGBA(1.0 - gl_FragCoord.z));",//current fragment depth
"float z_tex = DecodeFloatRGBA(texture2D(DX2RT, loc));",//depth in texture
//...do some stuff using z and z_tex
Mais quand il s'agit d'utiliser des textures à moitié flottantes (ipad, ipod), cette technique ne marche plus et je préfère ne pas utiliser d'encodage du tout. Mais dans ce dernier cas, j'ai encore une perte de précision.
Quelqu'un a-t-il une technique similaire mise en place pour les textures à demi-virgule flottante?
Merci d'avance.
rencontrent les mêmes difficultés, avez-vous résolu ce problème? – deblocker