首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在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

复制
相关文章
Java循环运行时暂停一段时间
GitHub项目地址Gitee项目地址Java 在运行 for 循环时,希望可以每个循环暂停一段时间。使用 sleep 方法即可:for (int i = 0; i < 10; i++) { try { System.out.println("i:" + i + " time:" + getTme()); Thread.sleep(10 * 1000); // 暂停10秒 } catch (InterruptedException e) { e.prin
代码的路
2023/03/21
9110
Java循环运行时暂停一段时间
GitHub项目地址:https://github.com/Snowstorm0/learn-sleep
代码的路
2023/05/24
4250
Java循环运行时暂停一段时间
理解for循环的运行机制
在Python语言中,for循环非常强大,乃至于通常都不怎么提倡使用递归,所有遇到递归的时候,最好都改为for循环。对于初学者而言,for循环理解起来并不难,一般的入门读物中也都这么解释:
老齐
2021/03/11
1.4K0
理解for循环的运行机制
python---时间和时间戳的关系转换
经常用的有time.time()、time.strftime()、time.strptime()、time.localtime()、time.mktime()
py3study
2020/01/09
1.7K0
python---时间和时间戳的关系转换
Golang语言--计算运行的时间
函数time.Since() 计算golang运行的时间是非常有用的性能衡量指标,特别是在并发基准测试中。下面将介绍如何简单地使用Go语言来计算程序运行的时间。 简单地使用Golang的time.Si
李海彬
2018/03/21
1.6K0
Golang语言--计算运行的时间
你真的会写for循环吗?来看看这些常见的for循环优化方式
我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。
Leetcode名企之路
2021/09/14
3760
Python 运行时遇到的这些错误
对于刚入门的Python新手,在学习过程中运行代码是或多或少会遇到一些错误,刚开始可能看起来比较费劲。随着代码量的积累,熟能生巧当遇到一些运行时错误时能够很快的定位问题原题。下面整理了在Python运行中常见的错误,希望能够帮助到大家。
小小科
2020/07/15
1.1K0
外层循环和内层循环的关系_内层电子跃迁与外层电子跃迁
之前做项目 发现外层表格全选时候 想全选内层表格 ,有用过toggleRowSelection,但是发现内层表格未打开时,无法触发内层表格的ref,所以我找了别的解决方法。
全栈程序员站长
2022/11/17
3190
解决循环依赖问题:优雅处理依赖关系的技巧
在软件开发中,依赖是不可避免的。我们经常需要在应用程序的不同组件之间建立依赖关系,以实现功能的模块化和复用。然而,有时候依赖关系可能变得复杂,甚至导致循环依赖的问题。在本文中,我们将通过项目中实际遇到的异常探讨一些解决循环依赖问题的技巧,帮助你在开发过程中优雅地处理依赖关系。
修己xj
2023/08/25
9590
解决循环依赖问题:优雅处理依赖关系的技巧
运行时间中的对数
如果一个算法用常数时间(O(1))将问题的大小消减为某一部分的(通常1/2),那么该算法就是O(logN).另一方面,如果使用常数时间只是把问题减少一个常数,那么该算法就是O(N).
心跳包
2020/08/31
3910
运行时间中的对数
动态库依赖关系_查看运行的动态库
这两天在编写一个插件系统Demo的时候,发现了个很奇怪的问题:插件加载器中已经链接了ld库,但是应用程序在链接插件加载器的时候,却还需要显式的来链接ld库。否则就会报:DSO missing from command line。这个报错翻译过来就是没有在命令行中指定该动态库。 这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢?
全栈程序员站长
2022/09/27
2.2K0
Data Science | 这些时间序列的骚操作啊
pd.DatetimeIndex()可以直接生成时间戳索引,支持使用str、datetime.datetime。 单个时间戳的类型为Timestamp,多个时间戳的类型为DatetimeIndex,示例如下:
咸鱼学Python
2019/10/09
7830
巧用 Lazy 解决.NET Core中的循环依赖关系
在构建应用程序时,良好的设计应该应避免服务之间的循环依赖, 循环依赖是指某些组件直接或间接相互依赖,比如下面这样
全球技术精选
2021/01/21
1.5K0
巧用 Lazy 解决.NET Core中的循环依赖关系
记住!这些 Linux 命令千万不要运行!
文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统。所以不在root等高级管理权限下执行命令是很好的习惯。
杰哥的IT之旅
2020/06/18
1.6K0
利用装饰器计算函数运行的时间
import time from functools import wraps def time_this_function(func): #作为装饰器使用,返回函数执行需要花费的时间 @wraps(func) def wrapper(*args,**kwargs): start=time.time() result=func(*args,**kwargs) end=time.time() print("函数:",fun
西西嘛呦
2020/08/26
1.1K0
c++怎么计算程序运行的时间
使用clock函数获得程序开始和结束的时间,相减就能得到程序运行的时间。clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:clock_t clock(void) ;简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。
杨鹏伟
2020/09/11
3.4K0
PHP脚本运行时间:
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 代码: 效果: ---- 代码: <style> body{ background:#ccc;
贵哥的编程之路
2022/09/23
1.6K0
PHP脚本运行时间:
网站运行时间siteTime();
Dabenshi
2023/05/26
4580
程序运行时间测试 - 使用系统函数 getrusage 获取程序运行时间
https://github.com/yaowenxu/Workplace/blob/master/timer/getrusagetimer.c
西湖醋鱼
2020/12/30
1.2K0
设置网站运行时间
使用javascript计算博客等网站的运行时间。 话不多说,直接贴码! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 function createTime() { var now = new Date(); var run = new Date("05/28/2018 20:01:01"); //
Cell
2022/02/25
7420

相似问题

这些循环的执行时间?

21

为什么这些嵌套循环的运行时间是O(n)

30

确定和分析这些不同循环的大O运行时间

23

这些嵌套循环的时间复杂性

11

确定这些嵌套循环的时间复杂度

10
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档