片段着色器中深度的半浮点值编码(WebGL 1.0)

片段着色器中深度的半浮点值编码(WebGL 1.0),webgl,precision,fragment-shader,color-depth,Webgl,Precision,Fragment Shader,Color Depth,我目前有一个工作实现,允许我将深度值编码到浮点纹理中 以下是编码/解码功能: “vec4编码浮点RGBA(浮点v){”, “浮点余数=v;”, “vec4 res,r;”, “res[0]=楼层(余数*255.0)/255.0;”, “余数-=res[0];”, “res[1]=楼层(剩余部分*65535.0)/65535.0;”, “余数-=res[1];”, “res[2]=楼层(剩余部分*16777215.0)/16777215.0;”, “余数-=res[2];”, “res[3]=楼

我目前有一个工作实现,允许我将深度值编码到浮点纹理中

以下是编码/解码功能:

“vec4编码浮点RGBA(浮点v){”,
“浮点余数=v;”,
“vec4 res,r;”,
“res[0]=楼层(余数*255.0)/255.0;”,
“余数-=res[0];”,
“res[1]=楼层(剩余部分*65535.0)/65535.0;”,
“余数-=res[1];”,
“res[2]=楼层(剩余部分*16777215.0)/16777215.0;”,
“余数-=res[2];”,
“res[3]=楼层(剩余部分*4294967295.0)/4294967295.0;”,
“r[0]=夹钳(地板((v)*255.0),0,255.);”,
“r[1]=夹钳(地板((v-res[0])*65535.0),0,255.;”,
“r[2]=夹钳(地板((v-res[0]-res[1])*16777215.0),0,255.);”,
“r[3]=夹钳(地板((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;”,
“返回r;”,
"}",
“浮点解码浮点rgba(vec4 rgba){”,
“返回点(rgba,vec4(1.0,0.00392156627450980392156862745098,1.525902189669642175965224689097E-5,5.9604648328104515558750364705942e-8));”,

“}”,
对于某些设备,我禁用了深度编码,对于其他设备,我使用了以下代码位:

 "vec4 EncodeFloatRGBA( float v ) {",
    "float remainder = v;",
    "vec4 res, r;",

    "res[0] = floor(remainder * 127.0) / 127.0;",
    "remainder -= res[0];",
    "res[1] = floor(remainder * 16383.0) / 16383.0;",
    "remainder -= res[1];",
    "res[2] = floor(remainder * 2097151.0) / 2097151.0;",

    "r[0] = clamp(floor((v) * 127.0),0.,127.);",
    "r[1] = clamp(floor((v - res[0]) * 16383.0),0.,127.);",
    "r[2] = clamp(floor((v - res[0] - res[1]) * 2097151.0),0.,127.);",

    "r.r = r[0] / 127.0;",
    "r.g = r[1] / 127.0;",
    "r.b = r[2] / 127.0;",
    "r.a = 1.;",
    "return r;",
 "}",


 "float DecodeFloatRGBA( vec4 rgba ) {",
     "return rgba.r + rgba.g/127. + rgba.b/16383.;",
 "}"

遇到同样的问题,你解决了吗?