我使用OpenGL在每个帧上绘制一个屏幕大小四边形到相同的位置,低阿尔法(小于0.1),在它们之间没有glClear(GL_COLOR_BUFFER_BIT)。这样,四角体应该会越来越多地降低前一帧图的可见度。
然而,阻尼效应在几秒钟后就停止了。如果我对四角体使用不低于0.1的alpha值,它就会像预期的那样工作。在我看来,OpenGL混合方程在多次迭代之后失败(较高的alpha值需要较少的迭代来累积到1,因此如果alpha >= 0.1没有出现问题)。α在8位中的下限是关于0.0039的,即1/255,所以α0.01应该是好的。
我尝试了几个混合设置,使用了以下呈现方法:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_DEPTH_BUFFER_BIT);
// draw black quad with translucency (using glDrawArrays)简单的片段着色器:
#version 450
uniform vec4 Color;
out vec4 FragColor;
void main()
{
FragColor = Color;
}我怎样才能解决这个问题?
发布于 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“值相乘即可。
https://stackoverflow.com/questions/25548179
复制相似问题