Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有可能做一个RGBA浮动和返回往返,并读取WebGL GLSLes1.0中的像素?

是否有可能做一个RGBA浮动和返回往返,并读取WebGL GLSLes1.0中的像素?
EN

Stack Overflow用户
提问于 2020-09-10 02:34:14
回答 1查看 837关注 0票数 1

我是在尝试每一种可能的算法大约一周后问这个问题的,并且可能在堆栈溢出时使用了所有先前的答案--没有结果。所以,请善待一位GLSL学徒。

我在试着

calculations

  • convert

  • 将RGBA转换为
  1. ,执行一些从RGBA

到RGBA

在GPU内部-初始的RGBA是通过Float32到Uint8转换在javascript中定义的。

关键是能够在GPU中进行计算(地理信息系统距离和类似的计算)后,进行往返行程和读取浮标,因为RGB的分辨率太低。

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

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

如果我不做RGBA most-significant

  1. 浮点数=> RGBA转换一切正常我放进GPU中的浮点数也是我得到的浮点数没有损失
  2. 如果我做了RGB =>浮点数=> RGB转换,它也工作得很好,所有的问题都是第四个组件的问题要么是最小的,要么是

请注意--我怀疑这适用于GLSL的后期版本,但这是WebGL GLSLes1.0,它具有更多的约束和更少的功能,而且我怀疑写入纹理将是对iOS的一个限制--这是我所需要的。

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

知道的很快是不可能的,这是不可能的,就目前而言--我至少不会再把头撞在墙上了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 05:13:14

那么,除非我重写代码,否则我不能发布完整的答案,因为我没有权限按照堆栈溢出的要求将代码重新授权为CC- by -SA-4.0。

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

https://github.com/mikolalysenko/glsl-read-float/blob/master/index.glsl

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

换一种方式,你可以使用多种方法让浮点进入一个着色器,制服,变体,甚至从浮点纹理阅读是支持大多数手机,包括iPhone AFAIK。通常不支持只过滤它们(这是您不需要的)并将其写入它们。

这里有个测试

代码语言:javascript
运行
AI代码解释
复制
async function main() {
  const gl = document.createElement('canvas').getContext('webgl');
  gl.canvas.width = 1;
  gl.canvas.height = 1;
  gl.viewport(0, 0, 1, 1);

  const req = await fetch('https://cdn.jsdelivr.net/npm/glsl-read-float@1.1.0/index.glsl')
  const glslFn = await req.text();

  const vs = `
  void main() {
    gl_PointSize = 1.0;
    gl_Position = vec4(vec3(0), 1);
  }
  `;

  const fs = `
  precision highp float;
  uniform float value;

  ${glslFn}

  void main() {
    gl_FragColor = encode_float(value).abgr;
  }
  `;

  const prg = twgl.createProgram(gl, [vs, fs]);
  const vLoc = gl.getUniformLocation(prg, 'value');
  gl.useProgram(prg);

  function test(v) {
    gl.uniform1f(vLoc, v);
    gl.drawArrays(gl.POINTS, 0, 1);
    const f = new Float32Array(1);
    const u = new Uint8Array(f.buffer);
    gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, u);

    console.log(`in: ${(new Float32Array([v]))[0]}, out: ${f[0]}`);
  }

  test(123.456);
  test(0.00913);
  test(1000000.1);
  test(0.0000001);

}
main();
代码语言:javascript
运行
AI代码解释
复制
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>

我要做的一件事是重写函数,以便它以相反的顺序输出值,因此不需要swizzle。

ps:这是Safari的一个版本,因为Safari的WebGL支持是以多种方式中断的

代码语言:javascript
运行
AI代码解释
复制
async function main() {
  const gl = document.createElement('canvas').getContext('webgl');
  gl.canvas.width = 1;
  gl.canvas.height = 1;
  gl.viewport(0, 0, 1, 1);

  const req = await fetch('https://cdn.jsdelivr.net/npm/glsl-read-float@1.1.0/index.glsl')
  const glslFn = await req.text();
  
  const vs = `
  attribute vec4 position;
  void main() {
    gl_PointSize = 1.0;
    gl_Position = position;
  }
  `;

  const fs = `
  precision highp float;
  uniform float value;

  ${glslFn}

  void main() {
    gl_FragColor = encode_float(value).abgr;
  }
  `;

  const prg = twgl.createProgram(gl, [vs, fs]);
  const vLoc = gl.getUniformLocation(prg, 'value');
  gl.useProgram(prg);
  
  // if safari  
  {
    // Safari fails if you don't have at least one attribute.
    // meaning it fails the WebGL Conformance Tests and has for > 4 years
    // in one of many ways.
    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
    gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW);
    const pLoc = gl.getAttribLocation(prg, "position");
    gl.enableVertexAttribArray(pLoc);
    gl.vertexAttribPointer(pLoc, 1, gl.UNSIGNED_BYTE, false, 0, 0);
  }

  function test(v) {
    gl.uniform1f(vLoc, v);
    gl.drawArrays(gl.POINTS, 0, 1);
    const f = new Float32Array(1);
    const u = new Uint8Array(f.buffer);
    gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, u);

    console.log(`in: ${(new Float32Array([v]))[0]}, out: ${f[0]}`);
  }

  test(123.456);
  test(0.00913);
  test(1000000.1);
  test(0.0000001);

}
main();
代码语言:javascript
运行
AI代码解释
复制
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>

更新

我想我可以看到您可能希望将编码的RGBA纹理传递到另一个着色器,这样传入浮动纹理并不是解决方案,所以我尝试制作一个RGAB ->浮动解码器。这似乎很管用。不知道它是否完全正确,也不知道有什么精度问题

代码语言:javascript
运行
AI代码解释
复制
async function main() {
  const gl = document.createElement('canvas').getContext('webgl');
  gl.canvas.width = 1;
  gl.canvas.height = 1;
  gl.viewport(0, 0, 1, 1);

  const req = await fetch('https://cdn.jsdelivr.net/npm/glsl-read-float@1.1.0/index.glsl')
  const glslFn = await req.text();

  const vs = `
    attribute vec4 position;
    void main() {
     gl_PointSize = 1.0;
     // gl_Position = vec4(vec3(0), 1); 
     gl_Position = position; 
  }
  `;

  const fs = `
    precision highp float;
    uniform sampler2D tex;

   ${glslFn}
   
   // note: the 0.1s here an there are voodoo related to precision
   float decode_float(vec4 v) {
     vec4 bits = v * 255.0;
     float sign = mix(-1.0, 1.0, step(bits[3], 128.0));
     float expo = floor(mod(bits[3] + 0.1, 128.0)) * 2.0 +
                  floor((bits[2] + 0.1) / 128.0) - 127.0;
     float sig = bits[0] +
                 bits[1] * 256.0 +
                 floor(mod(bits[2] + 0.1, 128.0)) * 256.0 * 256.0;
     return sign * (1.0 + sig / 8388607.0) * pow(2.0, expo);
   }

   void main() {
     float value = decode_float(texture2D(tex, vec2(0)));
     gl_FragColor = encode_float(value).abgr;
   }
`;

  const prg = twgl.createProgram(gl, [vs, fs]);
  const vLoc = gl.getUniformLocation(prg, 'value');
  gl.useProgram(prg);

  // if safari  
  {
    // Safari fails if you don't have at least one attribute.
    // meaning it fails the WebGL Conformance Tests and has for > 4 years
    // in one of many ways.
    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
    gl.bufferData(gl.ARRAY_BUFFER, 1, gl.STATIC_DRAW);
    const pLoc = gl.getAttribLocation(prg, "position");
    gl.enableVertexAttribArray(pLoc);
    gl.vertexAttribPointer(pLoc, 1, gl.UNSIGNED_BYTE, false, 0, 0);
  }

  gl.bindTexture(gl.TEXTURE_2D, gl.createTexture());

  function test(v) {
    const float = new Float32Array([v]);
    const data = new Uint8Array(float.buffer);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
    gl.drawArrays(gl.POINTS, 0, 1);
    const f = new Float32Array(1);
    const u = new Uint8Array(f.buffer);
    gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, u);

    log(`in: ${(new Float32Array([v]))[0]}, out: ${f[0]}`);
  }

  test(123.456);
  test(0.00913);
  test(1000000.1);
  test(0.0000001);
  test(-123.456);
  test(-0.00913);
  test(-1000000.1);
  test(-0.0000001);
  test(0.0);
  test(1/0);
  test(-1/0);
  test(1.175494351E-38),
  test(3.402823465E37),
  test(1+'foo');  // NaN
}

function log(...args) {
  const elem = document.createElement('pre');
  elem.textContent = args.join(' ');
  document.body.appendChild(elem);
}

main();
代码语言:javascript
运行
AI代码解释
复制
pre { margin: 0; }
代码语言:javascript
运行
AI代码解释
复制
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>

注意:我没有处理任何终端问题,尽管ATM没有我所知道的常见的大终端系统。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63827836

复制
相关文章
C#读取Excel表格中数据并返回datatable
在软件开发的过程中,经常用到从excel表格中读取数据作为数据源,以下整理了一个有效的读取excel表格的方法。 DataTable GetDataTable(string tableName,string leftTopCel,string rightbutCel) { bool hasTitle = false; OpenFileDialog openFile = new OpenFileDialog(); ope
码农阿宇
2018/04/18
2.4K0
Java结合OpenCV读取图片并遍历像素值[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137371.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/05
1.8K0
Java结合OpenCV读取图片并遍历像素值[通俗易懂]
CSS中的浮动和清除浮动,梳理一下!
从业三年,项目无数,现在回过头来,想要把一些重要的知识用白话整理出来:这个东西是什么?怎样才是最佳实践?希望对自己知识体系有梳理作用, 也希望对大家有些许帮助。 前端技术栈更新太快,眼花缭乱,大家一个劲揽过来学习的时候,别忘了回头看看那些已经掌握的基础知识。 第一篇就整理整理CSS中很常见的浮动以及清除浮动的一些方式吧。 浮动到底是什么? 浮动核心就一句话:浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或者另一个浮动元素。请默念3次! 浮动最初设计的目的并没那么多事儿,就只是用来实现文字环绕效果而已,
用户1667431
2018/04/18
1.7K0
CSS中的浮动和清除浮动,梳理一下!
几个简单的小例子手把手带你入门webgl
各位同学们大家好,又到了周末写文章的时间,之前群里有粉丝提问, 就是shader不是很理解。然后今天他就来了, 废话不多说,读完今天的这篇文章你可以学到以下几点:
coder_koala
2021/09/18
1.4K0
几个简单的小例子手把手带你入门webgl
​day006: 浮动布局的优点?有什么缺点?清除浮动有哪些方式?
这样做的优点就是在图文混排的时候可以很好的使文字环绕在图片周围。另外当元素浮动了起来之后,它有着块级元素的一些性质例如可以设置宽高等,但它与inline-block还是有一些区别的,第一个就是关于横向排序的时候,float可以设置方向而inline-block方向是固定的;还有一个就是inline-block在使用时有时会有空白间隙的问题
用户3806669
2021/03/10
9850
Ex1:图像读取和显示以及像素操作
dev下搭建环境,详情见https://www.jianshu.com/p/d5e18b9b0333
平凡的学生族
2019/05/25
5290
虚拟仿真程序部署方案:像素流技术和Webgl对比分析
经过近几年的发展,虚拟仿真教学在教育行业已经有一定的规模,目前的虚拟仿真程序部署方案多采用了单机版或者结合webgl技术,可以实现电脑安装运行,或者通过WebGL实现网页打开。虽然这些部署方案实现了虚拟仿真教学,但和理想的效果,还存在一定的差距。
点量小芹DolitQin520
2021/08/05
1.1K0
虚拟仿真程序部署方案:像素流技术和Webgl对比分析
webgl 基础
WebGL仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。 WebGL在电脑的GPU中运行,每对方法中一个叫顶点着色器, 另一个叫片断着色器,并且使用一种和C或C++类似的强类型的语言 GLSL。 每一对组合起来称作一个 program(着色程序)
ronixiao
2022/08/08
1.4K0
webgl智慧楼宇发光系列之线性采样下高斯模糊
前面一篇文章 <webgl智慧楼宇发光效果算法系列之高斯模糊>, 我们知道了 高斯模糊的本质原理,就是对每个像素,按照正态分布的权重去获取周边像素的值进行平均,是一种卷积操作。
用户3158888
2020/12/31
4540
判断链表中是否有环
操作一:定义了两个变量来记录,A一个一次走一步,B一个一次走两步,如果有环B必然会追上A。如果无环B必然会先遍历完。
忧愁的chafry
2022/10/30
1.6K0
判断链表中是否有环
WebGL 纹理颜色原理
腾讯IVWEB团队
2017/11/09
2.7K0
WebGL 纹理颜色原理
GDAL读取的坐标起点在像素左上角还是像素中心?
笔者在处理地理栅格数据的时候,总是会发生偏差半个像素的问题。 比如说通过ArcMap打开一张.tif,查看其地理信息;同时用记事本打开.tfw,比较两者得地理信息:
charlee44
2022/05/05
1.3K0
GDAL读取的坐标起点在像素左上角还是像素中心?
[Python图像处理] 二.OpenCV和Numpy读取修改像素、几何图形绘制
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2021/12/02
2.5K0
[Python图像处理] 二.OpenCV和Numpy读取修改像素、几何图形绘制
前端面试 【CSS】— 浮动布局有哪些优点?有什么缺点?清除浮动有哪些方式?
浮动布局优点就是在图文混排的时候可以很好的使文字环绕在图片周围。另外当元素浮动了起来之后,它有着块级元素的一些性质,例如可以设置宽高等。但它与inline-block还是有一些区别的,第一个就是横向排序的时候,float可以设置方向而inline-block方向是固定的;第二就是inline-block在使用时有时会有空白间隙的问题。
越陌度阡
2021/11/11
1.3K0
ExcelVBA判断区域中是否有值并输入数据
Sub tfff() ActiveSheet.UsedRange.Interior.ColorIndex = xlNone Rng = Range("a1") Range(Rng).Interior.ColorIndex = 2 Range(Rng).Borders.LineStyle = xlContinuous i = 1 For Each r In Range(Rng) If r.Value = "" Then r.Value = i i = i + 1 End If Next End Sub
哆哆Excel
2022/10/25
1.2K0
ExcelVBA判断区域中是否有值并输入数据
WebGPU 入门:绘制一个三角形
今天我们来入门 WebGPU,来写一个图形版本的 Hello World,即绘制一个三角形。
前端西瓜哥
2023/09/24
4750
WebGPU 入门:绘制一个三角形
可视化导学-图形基础
关于 HTML/CSS、SVG、Canvas2D 和 WebGL 这四种图形系统。
Cellinlab
2023/05/17
1.1K0
可视化导学-图形基础
(转载非原创)OpenGL ES 压缩纹理
在实际应用特别是游戏中纹理占用了相当大的包体积,而且GPU无法直接解码目前流行的图片格式,图片必须转换为RGB等类型的格式才能上传到GPU内存,这显然增加了GPU内存的占用。为了处理这些问题于是出现了GPU支持的压缩纹理格式,在GPU中进行解码。压缩纹理属于有损压缩,更在意解码速度,而编码在程序运行之前,因此速度较慢。
xlj
2021/07/07
1.3K0
GDI+ 读取jpg图片每个像素的值
// 读取jpg图像像素rgb值.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace std; using namespace Gdiplus; int main()
流川疯
2022/11/29
1.2K0
GDI+ 读取jpg图片每个像素的值
点击加载更多

相似问题

未返回正确值的webgl读取像素

12

从WebGL纹理读取像素

17

如何使用枕头获取浮动RGBA像素值的列表?

13

像素和颜色- WebGL

11

是否有可能在WebGL中实现延迟着色?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文