首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGLα混合突然停止

OpenGLα混合突然停止
EN

Stack Overflow用户
提问于 2014-08-28 11:54:56
回答 1查看 579关注 0票数 1

我使用OpenGL在每个帧上绘制一个屏幕大小四边形到相同的位置,低阿尔法(小于0.1),在它们之间没有glClear(GL_COLOR_BUFFER_BIT)。这样,四角体应该会越来越多地降低前一帧图的可见度。

然而,阻尼效应在几秒钟后就停止了。如果我对四角体使用不低于0.1的alpha值,它就会像预期的那样工作。在我看来,OpenGL混合方程在多次迭代之后失败(较高的alpha值需要较少的迭代来累积到1,因此如果alpha >= 0.1没有出现问题)。α在8位中的下限是关于0.0039的,即1/255,所以α0.01应该是好的。

我尝试了几个混合设置,使用了以下呈现方法:

代码语言:javascript
复制
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_DEPTH_BUFFER_BIT);
// draw black quad with translucency (using glDrawArrays)

简单的片段着色器:

代码语言:javascript
复制
#version 450

uniform vec4 Color;
out vec4 FragColor;

void main()
{
    FragColor = Color;
}

我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-30 12:58:17

在我看来,OpenGL混合方程在多次迭代之后失败(较高的alpha值需要较少的迭代来累积到1,因此如果alpha >=0.1没有出现问题)。α在8位中的下限约为0.0039 (1/255),因此α0.0 1应该可以。

你的推理是错误的。如果您画了一个带有0.0 1α的黑色四角体,以及您描述的混合设置,那么您基本上可以在每次迭代中得到new_color = 0.99 * old_color。作为迭代次数i的函数,它将是new_color(i) = original_color * pow (0.99,i)。现在,随着无限的精度,这将移动到0。

但正如你已经指出的,精确性并不是无限的。你每走一步就能得到一次再化。因此,如果您的new_color颜色值没有降到整数值的阈值以下,它将保持不变。现在,如果我们考虑x在0,255范围内的非标化颜色值,并且假设量化是由通常的舍入规则完成的,那么我们必须得到至少0.5的差才能得到不同的值:x - x * (1-alpha) > 0.5,或者简单地说是x > 0.5 / alpha

所以在你的例子中,你得到x> 50,这就是混合将“停止”的地方(并且下面的所有东西都会保持原样,所以你得到一个黑暗部分的“阴影”)。对于0.1的alpha,它将以x=5结尾,这很可能接近于零,以至于您没有注意到它(使用特定的显示和设置)。

编辑

让我推荐一种能起作用的初创公司。您必须避免迭代组件(至少使用非浮点帧缓冲区)。你想要达到褪色到黑色的效果。因此,您可以将原始内容呈现为纹理,并一次又一次地呈现,同时通过将alpha值从一个帧更改到另一个框架,将其混合为黑色,因此最终得到alpha作为时间(或帧号)的函数。使用线性转换可能是最有意义的,但您甚至可以使用一些非线性函数来获得淡出的速度,就像您最初的方法一样,没有限制的精度。

注意,您根本不需要混合,您只需将纹理中的颜色值与片段着色器中的一些统一的"alpha“值相乘即可。

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

https://stackoverflow.com/questions/25548179

复制
相关文章

相似问题

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