是否可以在WebGL GLSL ES 1.0中执行RGBA浮动和返回往返并读取像素?

是否可以在WebGL GLSL ES 1.0中执行RGBA浮动和返回往返并读取像素?,glsl,webgl,Glsl,Webgl,我在尝试了大约一周的每一种可能的算法后提出了这个问题,并使用了stackoverflow之前的所有答案,但没有结果。所以,请善待并帮助GLSL学徒 我正在努力 将RGBA转换为浮点 进行一些计算 将浮点转换为RGBA 在GPU内部-初始RGBA通过Float32到Uint8的转换在javascript中定义 关键是在GPU中计算GIS距离和类似距离后,能够进行往返并读取浮点值,因为RGB的分辨率太低 我想通过gl.readPixels将结果读回javascript 我开始怀疑这种可能性的原因是:

我在尝试了大约一周的每一种可能的算法后提出了这个问题,并使用了stackoverflow之前的所有答案,但没有结果。所以,请善待并帮助GLSL学徒

我正在努力

将RGBA转换为浮点 进行一些计算 将浮点转换为RGBA 在GPU内部-初始RGBA通过Float32到Uint8的转换在javascript中定义

关键是在GPU中计算GIS距离和类似距离后,能够进行往返并读取浮点值,因为RGB的分辨率太低

我想通过gl.readPixels将结果读回javascript

我开始怀疑这种可能性的原因是:

如果我不做RGBA=>float=>RGBA转换,一切正常-我放入GPU的浮点也是我取出的浮点-没有损失 如果我进行RGB=>float=>RGB转换,它也可以正常工作,所有的问题都在于第四个分量是最不重要的或最重要的 请注意-我怀疑这适用于GLSL的更高版本,但这是WebGL GLSL ES 1.0,具有更多的约束和更少的功能,我怀疑写入纹理将是iOS上的一个约束-这是我需要的

我已经考虑过列出我在这里尝试过的所有代码——如果必要的话可以这样做,但这似乎有些过头了


很快知道这是不可能的,现在就足够了——至少我不会再碰壁了。

好吧,除非我重新编写代码,否则我无法发布完整答案,因为我没有权限按照堆栈溢出的要求将代码重新授权为CC-BY-SA-4.0

但是,这里有一个麻省理工学院许可的GLSL片段

这似乎适用于在着色器中使用浮点并转换RGBA8颜色

另一种方法是,你可以使用任意数量的方法将浮点数放入着色器、制服、变量,甚至从浮点数纹理读取,包括iPhone AFAIK在内的大多数手机都支持。通常不支持只过滤您不需要的内容并向其写入内容

这是一个测试

异步函数主{ const gl=document.createElement'canvas.getContext'webgl'; gl.canvas.width=1; gl.canvas.height=1; 总图视口0,0,1,1; const req=等待提取'https://cdn.jsdelivr.net/npm/glsl-read-float@1.1.0/index.glsl' const glslFn=等待请求文本; 常数vs=` 真空总管{ gl_PointSize=1.0; gl_位置=vec4vec30,1; } `; 常数fs=` 高精度浮点; 均匀浮点数; ${glslFn} 真空总管{ gl_FragColor=encode_floatvalue.abgr; } `; const prg=twgl.createProgramgl[vs,fs]; const vLoc=gl.getUniformLocationprg,“值”; gl.useProgramprg; 功能测试{ gl.uniform1fvLoc,v; gl.drawArraysgl.POINTS,0,1; 常数f=新浮点数1; const u=新的Uint8Arrayf.buffer; gl.readPixels0,0,1,1,gl.RGBA,gl.UNSIGNED_字节,u; log`in:${new Float32Array[v][0]},out:${f[0]}`; } test123.456; test0.00913; test1000000.1; test0.0000001; } 主要的
除非我重新编写代码,否则我无法发布完整答案,因为我没有权限按照堆栈溢出的要求将代码重新许可为CC-BY-SA-4.0

但是,这里有一个麻省理工学院许可的GLSL片段

这似乎适用于在着色器中使用浮点并转换RGBA8颜色

另一种方法是,你可以使用任意数量的方法将浮点数放入着色器、制服、变量,甚至从浮点数纹理读取,包括iPhone AFAIK在内的大多数手机都支持。通常不支持只过滤您不需要的内容并向其写入内容

这是一个测试

异步函数主{ const gl=document.createElement'canvas.getContext'webgl'; gl.canvas.width=1; gl.canvas.height=1; 总图视口0,0,1,1; const req=等待提取'https://cdn.jsdelivr.net/npm/glsl-read-float@1.1.0/index.glsl' const glslFn=等待请求文本; 常数vs=` 真空总管{ gl_PointSize=1.0; gl_位置=vec4vec30,1; } `; 常数fs=` 高精度浮点; 均匀浮点数; ${glslFn} 真空总管{ gl_FragColor=encode_floatvalue.abgr; } `; const prg=twgl.createProgramgl[vs,fs]; const vLoc=gl.getUniformLocationprg,“值”; gl.useProgramprg; 功能测试{ gl.uniform1fvLoc,v; gl.drawArraysgl.POINTS,0,1; 常数f=新浮点数1; const u=新的Uint8Arrayf.buffer; gl.readPixels0,0,1,1,gl.RGBA,gl.UNSIGNED_字节,u; log`in:${new Float32Array[v][0]},out:${f[0]}`; } test123.456; test0.00913; test1000000.1; test0.0000001; } 主要的