我有一个OpenGL RGBA纹理,我使用帧缓冲对象将另一个RGBA纹理加入其中.问题是,如果我使用通常的混合函数与
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),
结果blit导致目标纹理alpha更改,使其略微透明的alpha以前是1的地方.我希望目标表面alpha永远不会改变,但否则效果RGB值应该与GL_SRC_ALPHA和/ 完全一样GL_ONE_MINUS_SRC_ALPHA.因此,混合因子函数应该是(As,As,As,0)和(1-As,1-As,1-As,1).我怎样才能做到这一点?
我的表单上显示了一个网络摄像头源,并希望在其上绘制.我打算用图片框来做这件事,我发现PictureBox不支持真正的透明度,而只是它所用的表格的颜色.它也不支持alphablending,这是我希望它显示的方式,类似于可以如何显示表单.
有谁知道如何做到这一点?或者实施了可以执行此操作的控件?
如何改变基于TWinControl的控件的不透明度?为什么他们没有将这种能力添加到TControl/TWinControl级别(为什么只有TForm)?
如果有可疑的参数值,则会在对话框中显示"警告"图像.用户并不总是会注意到它,所以我想在一秒左右的时间内循环淡入淡出(是的,我可以切换Visible属性,但这看起来有点像我只是切换Visible属性).有没有比将它放在自己的表单上并将其浮动在对话框上(以及更改表单的AlphaBlendValue属性)更简单的方法?
如果我想显示一个统一的半透明图像,然后"淡出"此图像,逐渐将其替换为另一个相同的透明度,同时在过渡期间将组合透明度保持在恒定水平,如何确定透明度绘制图像?
通过反复试验 - 将各种alphas的透明图像相互叠加 - 我想出了下图,显示了一个轴上图像A的透明度和另一个轴上图像B的透明度.'isoalpha'线显示alpha的组合,沿着线一直产生相同的alpha.每条线用于不同的alpha级别,左上角完全透明.
你可以看到我正在寻找的公式不是alphaA + alphaB == alphaTarget的直线转换.
我正在寻找的数学公式是什么?

X轴 - 图像B的α(0-255 lr).Y轴 - 图像A的alpha(向下0-255).
看起来不像 RGB1*A1 + RGB2*A2 那么简单......值是如何裁剪的?加权?ETC。
这是一个依赖于上下文的问题吗?是否有不同的算法会产生不同的结果?或者一种标准实现?
我对特定于 OpenGL 的答案特别感兴趣,但来自其他环境的上下文也很有用。
是否可以使用alphablend函数使图像的某些部分透明?
我可以创建一个包含RGB(0,0,255)特定区域的图像,当我绘制该图像时,该区域应该是透明的.这可能是AlphaBlend函数.是的,那么如何?
我正在阅读有关alphablend的内容,但我仍然不清楚.我想我们需要在创建图像时指定alphachannel.如果某个像素不存在alphachannel,那么该像素不能透明?
我试图显示"透明"表面(不是封闭的体积),正面和背面都是可见的(没有剔除).
例如,显示在两侧都应用透明度的圆锥或圆柱体.有一些可见的工件,表面的某些部分似乎没有正确处理alpha值.
似乎问题是当我(opengl)试图将alpha从表面的正面应用到表面的背面时.(当表面的内部/外部都可见时).
void init()
{
glMatrixMode(GL_PROJECTION);
gluPerspective( /* field of view in degree */ 40.0,
/* aspect ratio */ 1.0,
/* Z near */ 1.0, /* Z far */ 10.0);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */
0.0, 0.0, 0.0, /* center is at (0,0,0) */
0.0, 1.0, 0.); /* up is in positive Y direction */
glTranslatef(0.0, 0.6, -1.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
glLightfv(GL_LIGHT2, GL_DIFFUSE, …Run Code Online (Sandbox Code Playgroud) 我有一个像素的RGB元组,我们称之为P.
(255,0,0)是P的颜色,alpha通道为1.0.
当alpha通道为0.8时,P的颜色变为(255,51,51).
如何获得影响P颜色的像素颜色?
transparency alpha alphablending image-processing alpha-transparency
我创建了一个查找表,允许您使用单字节alpha通道混合两个单字节通道(每通道256色),不使用浮点值(因此没有浮点到int转换).查找表中的每个索引对应于与alpha值相关的信道的256ths的值.
总而言之,为了完全计算3通道RGB混合,每个通道需要对阵列进行两次查找,再添加一个.这是总共6次查找和3次添加.在下面的示例中,我将颜色分成单独的值以便于演示.此示例显示如何通过范围从0到256的alpha值混合三个通道RG和B.
BYTE r1, r2, rDest;
BYTE g1, g2, gDest;
BYTE b1, b2, bDest;
BYTE av; // Alpha value
BYTE rem = 255 - av; // Remaining fraction
rDest = _lookup[r1][rem] + _lookup[r2][av];
gDest = _lookup[g1][rem] + _lookup[g2][av];
bDest = _lookup[b1][rem] + _lookup[b2][av];
Run Code Online (Sandbox Code Playgroud)
它很棒.精确,因为你可以使用256色通道.实际上,您可以使用实际的浮点计算得到相同的精确值.查找表是使用双打开始计算的.查找表太大,不适合这篇文章(65536字节).(如果你想要它的副本,请发送电子邮件至ten.turtle.toes@gmail.com,但不要期待明天的回复,因为我现在要睡觉了.)
所以你怎么看?它值得吗?