首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在WebGL中输出大于1的片段值

如何在WebGL中输出大于1的片段值
EN

Stack Overflow用户
提问于 2014-07-20 13:51:35
回答 3查看 4K关注 0票数 3

假设我呈现的是两个样本,它们将合并成一个图像。第一个示例包含可显示像素范围以外的值(在这种情况下,大于1)。但是当被第二个样本减去时,它确实在这个范围内。

我将样本存储在帧缓冲纹理中,然后再组合它们。

我希望能够存储大于1的值,但是这些值被限制为1。GLSL片段着色器能输出这样的值吗?纹理能储存它们吗?如果没有,我还能怎么储存呢?

根据此页的说法,有可能:

呈现到屏幕要求输出是一种可显示的格式,在多通道管道中并不总是这样。有时,由pass生成的纹理需要有浮点格式,而不是直接转换成颜色。

但根据规范,纹理浮动夹紧范围为0,1。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-21 08:17:39

最简单的方法是使用浮点纹理。

代码语言:javascript
运行
AI代码解释
复制
var gl = someCanvasElement.getContext("experimental-webgl");
var ext = gl.getExtension("OES_texture_float");
if (!ext) {
    alert("no OES_texture_float");
    return;
}

现在,您可以创建和渲染浮点纹理。接下来要做的是看看你是否可以渲染到浮点纹理。

代码语言:javascript
运行
AI代码解释
复制
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, null);
gl.texParameteri(gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_MAG_FILTER, gl.NEAREST);

var fb = gl.createFramebuffer();
gl.bindFrameBuffer(gl.FRAMEBUFFER, fb);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);

var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
if (status != gl.FRAMEBUFFER_COMPLETE) {
  alert("can not render to floating point textures");
  return;
}

使用OES_texture_float时不夹紧浮标

如果设备不支持将结果呈现为浮点纹理,那么就必须以其他方式对结果进行编码,就像gil建议的那样

WebGL2

注意:在WebGL2中,浮点纹理总是可用的。另一方面,如果要筛选浮点纹理,仍然需要检查和启用OES_texture_float_linear。在WebGL2中,您还需要启用EXT_color_buffer_float将其呈现为浮点纹理(而且仍然需要调用gl.checkFramebufferStatus,因为这取决于支持附件组合的驱动程序)。此外,还有EXT_float_blend,用于在呈现为浮点纹理时是否启用混合。

票数 4
EN

Stack Overflow用户

发布于 2014-07-20 20:25:36

片段着色器可以在0.0、1.0范围之外输出值,但只有在将值写入缓冲区的格式以支持该范围以外的值时才能输出值。启用此功能所需的是存储浮点值的呈现目标(呈现缓冲区或附加到FBO的纹理)。

OpenGL ES 2.0及更低版本不需要对浮点格式纹理的支持。OpenGL ES 3.0及以上的do。例如,在ES3.0中,您可以使用GL_RGBA16F作为带有16位浮点数(又称半浮点数)组件的RGBA纹理,对32位浮点数组件使用GL_RGBA32F。但是,ES 3.0和3.1仍然不需要将这些格式用作呈现目标的支持,这正是这个用例所需要的。

ES2.0实现可以通过支持浮动提供半浮动纹理,通过支持浮动扩展提供浮动纹理。为了支持对半浮动纹理的渲染,他们还需要浮动浮动将呈现定义为浮动纹理,但指定基于ES3.0。

总结如下:

  • 通过支持OES_texture_half_float和EXT_color_buffer_half_float扩展,ES2.0和更高版本可以支持16位浮点纹理的呈现。
  • ES 3.0及更高版本可以通过支持OES_texture_float和EXT_color_buffer_float扩展来支持32位浮点纹理的呈现。

如果您想使用这些特性,您将不得不测试这些扩展是否存在于您的设备上。

票数 2
EN

Stack Overflow用户

发布于 2014-07-21 03:20:50

这里的关键思想是使用0,1范围内的2或4个不动点8位通道(颜色通道)在一些不受限制的范围内对浮点数进行编码。该方法是通用的,适用于WebGL或任何其他GL系统。

让我们假设您以一个浮动值开始:

代码语言:javascript
运行
AI代码解释
复制
float value;

假设您的机器支持中间(16位浮点数),您可以使用2 8位通道编码值:

代码语言:javascript
运行
AI代码解释
复制
float myNormalize(float val)
    {
    float min = -1.0;
    float max = 1.0;
    float norm = (val - min) / (max - min);
    return norm;
    }


vec2 encode_float_as_2bytes(float a)
    {
    a = myNormalize(a);
    vec2 enc = vec2(1.0, 256.0);
    enc *= a;
    enc = fract(enc);
    enc.x -= enc.y * (1.0 / 256.0);
    return enc;
    }

在这里,encode_float_as_2bytes(float a)接受要编码的值。该值首先被规范化为0, 1,使用一些边界值(在我的示例中,我的浮点数可以在-1,1中取值。归一化后,该值使用vec2编码。现在,您可以将编码的值写入颜色缓冲区:

代码语言:javascript
运行
AI代码解释
复制
float a = compute_something(...);
gl_FragColor.xy = encode_float_as_2bytes(a);

现在,当读取编码的值(通过其他着色器或使用glReadPixels() )时,您可以解码编码的浮点并获取值:

代码语言:javascript
运行
AI代码解释
复制
float denormalize(float val)
    {
    float min = -1.0;
    float max = 1.0;
    float den = val * (max - min) + min;
    return den;
    }


float decode_2_bytes(vec2 a)
    {
    float ret;
    ret = a.x * 1.0 + a.y * 1.0/256.0;
    ret = denormalize(ret);
    return ret;
    }

注意,反规范化值必须与规范化值相匹配(在本例中- 1,1)。

您可以在这里找到有关浮点编码的更多信息:http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/

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

https://stackoverflow.com/questions/24855256

复制
相关文章
SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作
版权声明:本文为王小雷原创文章,未经博主允许不得转载 https://blog.csdn.net/dream_an/article/details/50416819
王小雷
2019/05/27
7080
SAS进阶《深入解析SAS》之Base SAS基础、读取外部数据到SAS数据集
本文介绍了SAS进阶《深入解析SAS》之Base SAS基础、读取外部数据到SAS数据集,以及使用SAS/ACCESS接口引擎进行数据库访问和SQL查询的方法。
王小雷
2018/01/02
2.1K0
SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理
王小雷
2018/01/02
1.7K0
CAN总线简介:如何以编程方式控制汽车
最近,我正与Voyage公司的朋友合作研究,以实现福特Fusion空调系统(A/C)的编程控制。目前,Voyage公司正努力打造自动驾驶的终极目标:能够以低廉的价格成本和广泛的投放范围,把世界任何地方有用车需求的人们安全自动地送达目的地。对Voyage来说,在真正实现不需司机的无人驾驶之后,必须给予后座乘客对车辆关键功能的访问控制权。 Voyage Auto:硅谷自动自动驾驶出租车初创公司,由专注机器学习、人工智能等方面的在线培训机构Udacity于2017年4月成立,在无人驾驶领域,Voyage将与谷
FB客服
2018/02/28
3.6K0
CAN总线简介:如何以编程方式控制汽车
SAS-编程中的小技巧
今天分享的是SAS软件使用过程的中的几个小技巧,掌握了一些小技巧,编程的效率会提高的更快,还能减少敲代码出错率,好处很多,小编就不一一赘述了。 ----Setup~ 1 快捷键(功能键的使用) 今小编这里说的快捷键,并不是通俗意义上的那种CTRl+A、CTRL+C的这种快捷键,而是SAS编程里面的宏功能键(我称“快捷键”)。改键的使用,可实现设置代码块,以后只敲击代码块的缩写,自动就弹出代码。 01 看效果 1.以输入CSV为例 2.输入回车
企鹅号小编
2018/02/05
1.7K0
SAS-编程中的小技巧
SAS-编程中的小技巧
今小编这里说的快捷键,并不是通俗意义上的那种CTRl+A、CTRL+C的这种快捷键,而是SAS编程里面的宏功能键(我称“快捷键”)。改键的使用,可实现设置代码块,以后只敲击代码块的缩写,自动就弹出代码。
Setup
2019/10/21
1.5K0
SAS进阶《深入解析SAS》之对多数据集的处理
本文介绍了SAS中数据集纵向串接和横向合并的方法,包括使用DATA步、SET语句、APPEND过程、MERGE语句等方法。同时,还介绍了如何通过数据集选项IN=操作观测和更新UPDATA语句对数据集进行更改。最后,介绍了数据集的更改和更新语句的注意事项和具体操作方法。
王小雷
2018/01/02
1.6K0
java中获得文件大小代码
  根据指定文件创建FileInputStream,调用available方法返回文件大小,容量为byte                 File file = new File("d:\hello.gif");                 FileInputStream fis = null;                 try{                     fis = new FileInputStream(file);                       Syst
闵开慧
2018/03/30
1.1K0
SAS-编程中的小技巧(九)
新年的第一篇推文,一直打算写一点什么,小编辗转反侧、思来想去,发现编程中的小技巧已经写了八篇,如果在写一篇,那便是第九篇,与2019年的9有遥相呼应之势!好像做为新年的第一篇是一件很吉祥的事情。于是,在着实没什么内容想写的情况之下,今天小编打算分享一点编程中的小技巧。
Setup
2019/10/20
8980
SAS-编程中的小技巧(二)
嗯,这是一篇SAS编程的中的小技巧,不知是否记得小编之前写过一篇SAS-编程中的小技巧(可点击跳转),嗯,这又是一些编程中相关的小技巧。接下来小编将一一介绍这几个小技巧。
Setup
2019/10/21
1.1K0
SAS-编程中的小技巧(二)
SAS-编程中的小技巧(六)
前段时间有人问小编,批量执行ods输出文件时,总是弹出并打开输出的文件,有没有办法关闭呢?你是否也遇到这样的问题,而找遍ods相关的Option仍无法解决呢?解决办法其实还是很简单的。下面来看看怎么解决。
Setup
2019/10/20
1.7K0
SAS-编程中的小技巧(十一)
“一鼓作气再而衰三而竭”,趁着还没有衰,于是小编就又开始写推文了。许久未写编程中的小技巧了,今天小编打算分享一下编程中的小技巧。
Setup
2019/10/19
9440
SAS-编程中的小技巧(十一)
SAS-编程中的小技巧(三)
这又是一篇SAS编程中的小技巧,这次要说的是SAS中数据字典与Macro结合起来的使用技巧,以及数据集删除、保存等技巧....
Setup
2019/10/20
2.4K0
SAS-编程中的小技巧(八)
很久没写公众号了...也积累很多想要分享的小技巧,奈何一直苦于工作繁忙,诸事繁多无暇分身...在即将要忘掉所有想分享的小技巧的前一秒想起了公众号还没写呢...最近一直在写报告,用SAS输出RTF,所有啊,今天打算分享的也是RTF输出相关的小技巧...
Setup
2019/10/20
1.6K0
SAS-编程中的小技巧(七)
虽然难以启齿,但是花费巨额的代价买的教训,还是想分享给大家。“驾驶有风险,开车需谨慎”
Setup
2019/10/20
9260
SAS-编程中的小技巧(四)
SAS软件初始配置,其实是设置了自动保存代码的功能,好像是每10分钟保存一次,这个时间小编觉得有点长,毕竟10分钟能敲下好多代码...所以啊,就看看如何设置把这个时间给调小一下...
Setup
2019/10/21
1.4K0
SAS-编程中的小技巧(四)
SAS-编程中的小技巧(十)
果然是不动脑筋久了就会变蠢,最近小编写程序感觉变蠢了许多。思来想去究其原因发现是公众号许久未更了。为了不让愚蠢延续下去,今天小编打算分享一些SAS编程相关的小技巧。
Setup
2019/10/20
1K0
【从零开始学SAS】1、创建时间序列SAS数据集
注:intnx函数的三个参数,第一个参数是指定等时间间隔,可以是day week monthquarter year等。第二个参数是指定参照时间。第三个参数是_n_k,用来调整开始观测指针,k为正整数时指针由参照时间向未来拨k期;k取负整数时反之。
统计学家
2019/04/10
2.2K0
【从零开始学SAS】1、创建时间序列SAS数据集
SAS-编程中的小技巧(十二)
懒惰的小编好像开启了一月一更的模式了,许久未写编程中的小技巧了,于是今天小编打算分享几个编程中的小技巧。
Setup
2019/10/31
1.9K0
网络编程中的大小端
在计算机领域,大小端(Endianness)是指字节序的排列顺序。简单来说,就是存储器中多字节数据的字节序列,从高到低或从低到高的顺序不同。那么,何谓大小端呢?
李述铜
2023/05/01
8240

相似问题

以适当的方式显示时间

25

UIDatePicker没有显示适当的时间

26

消息对话框在错误的时间显示

30

在上载时间显示适当的消息

30

为什么我的文本框在jquery中不返回任何适当的值?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档