问题标签 [blending]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
258 浏览

actionscript-3 - 将对象相互混合但不与背景动作 3

我有许多希望相互融合的对象(表示为 DisplayObjects)。

然而,在这些对象背后有一个我不想参与混合的背景。

所以基本上我想将这些对象相互混合,然后将这种混合的结果用作新的 DisplayObject(例如将其放在随机彩色背景的顶部)。

所以我有的是:

我尝试的第一次尝试是将这些对象放入一个通用的 DisplayObjectContainer 中,希望混合模式仅与同一个 DisplayObjectContainer 包含的所有对象相关,但情况似乎并非如此。

所以这并没有让我到任何地方。任何帮助表示赞赏。

编辑:在最后一个代码片段中将 DisplayObjectContainer 更改为 Sprite

0 投票
5 回答
9078 浏览

c++ - 如何使用 OpenGL 制作渐变到黑色的效果?

我试图实现淡入黑色的效果,但我不知道该怎么做。我尝试了几件事,但由于opengl的工作方式而失败了

我将解释它是如何工作的:

如果我绘制 1 个白色像素并将其围绕每个帧移动一个像素到某个方向,则每帧屏幕像素将减少一个 R/G/B 值(范围为 0-255),因此在 255 帧后白色像素将全黑。因此,如果我移动白色像素,我会看到从白色到黑色的渐变轨迹,与之前的像素颜色相比,颜色值差异均匀。

编辑:我更愿意知道非着色器的方式,但如果不可能,那么我也可以接受着色器方式。

Edit2:由于这里有些混乱,我想说我已经可以通过在整个场景上绘制一个黑色透明四边形来实现这种效果。但是,这不起作用,因为我希望它起作用;像素可以获得的黑暗度是有限制的,所以它总是会让一些像素“可见”(高于零颜色值),因为:1*0.9 = 0.9 -> 再次四舍五入为 1,等等。我可以“修复“这是通过缩短轨迹来实现的,但我希望能够尽可能地调整轨迹长度,而不是双线性(如果这是正确的话)插值我想要线性(所以它总是会从每个 r 中减少 -1, g,b 值在 0-255 范围内,而不是使用百分比值)。

Edit3:仍然有些混乱,所以让我们明确一点:我想通过从 glClear() 禁用 GL_COLOR_BUFFER_BIT 来改善效果,我不想永远看到屏幕上的像素,所以我想让它们及时变暗,通过在我的场景上绘制一个四边形,将每个像素的颜色值减少 1(在 0-255 范围内)。

Edit4:我会简单点,我想要 OpenGL 方法,效果应该使用尽可能少的功率、内存或带宽。这种效果应该在不清除屏幕像素的情况下工作,所以如果我在我的场景上绘制一个透明的四边形,之前绘制的像素会变得更暗等。但正如上面几次解释的那样,它不能很好地工作。最大的NO是:1)从屏幕读取像素,在for循环中一一修改,然后上传回来。2) 用不同的暗度渲染我的对象 X 次以模拟轨迹效果。3)乘以颜色值不是一种选择,因为它不会使像素变成黑色,它们会以一定的亮度永远留在屏幕上(参见上面的解释)。

0 投票
1 回答
1388 浏览

c++ - 如何将纹理颜色与简单的乘法混合到它下面的颜色?

所以我希望我的纹理颜色与它下面的颜色相乘,如何使用 glBlendFunc() 来完成?

例如:如果我有一个纹理颜色 (0.31, 0.51, 0.124) 并且在它下面有一个颜色 (0.83, 0.64, 0.12),则生成的颜色将为 0.31*0.83, 0.51*0.64, 0.124*0.12。这该怎么做?

0 投票
1 回答
504 浏览

ipad - 在 OpenGL ES 中重叠 2 个透明 Texture2D

我正在尝试使用 OpenGL 为 iPad 制作 2D 游戏。一般来说,我是 OpenGL 的新手,所以这种混合的东西是新的。

我的绘图代码如下所示:

(“纹理”是具有透明背景的Texture2D)我需要知道的只是制作它,以便纹理周围的蓝色框不会覆盖另一个。

0 投票
2 回答
575 浏览

function - 混合两个函数,其中一个是逆函数

让我先解释一下这个想法。实际的数学问题在屏幕截图下方。出于音乐目的,我正在构建一个凹槽算法,其中事件位置由数学函数 F(X) 转换。这些位置在凹槽范围内进行了归一化,所以我基本上处理的是零到一之间的值(这使得凹槽曲线更容易成型——唯一的限制是 x'>=0)。这种凹槽算法接受任何事件位置,并且还通过从数据结构(如时间线音符轨道)中过滤静态音符来工作。为了过滤一定范围内的事件(音频块大小),我需要逆凹槽功能来定位音轨中的音符并将它们转换到凹槽空间中。到目前为止,一切都很好。有用!

在此处输入图像描述

在此处输入图像描述

简而言之:我使用反函数是因为它镜像到 (y=x)。所以我可以插入一个值 x 并得到一个 y。这个 y 显然可以插入反函数以再次获得第一个 x。

问题:我现在希望能够将凹槽混合到另一个凹槽中,但是通常的线性(提示)混合代码的行为不像我预期的那样。为了更容易,我首先尝试混合到 y=x。

对于 alpha=1,我们得到完整的曲线。对于 alpha=0,我们得到直线。但是对于 0 到 1 之间的 alpha,B(x) 和 iB(x) 不再镜像(接近,但还不够),F(x) 和 iF(x) 仍然是镜像的。

有没有解决方案(除了将曲线量化为线段)?有什么我应该关注的主题吗?

0 投票
1 回答
948 浏览

visual-c++ - 为什么 alpha 混合在正交中不起作用?

这是我在绘制 3D 对象后打开正射投影的方式:

这就是我在绘制 3D 对象后打开混合并以正交方式绘制纹理的方式:

Quad1 比 Quad2 大一点,涵盖了 Quad2 的某些部分。两种纹理都具有 RGBA 形式的 Alpha 通道。

问题是,Quad1 和 Quad2 正确地用 alpha 覆盖 3D 对象,但是 Quad1 的 alpha 在 Quad2 上时不起作用。它仅像 RGB 一样在 Quad2 之上绘制。

我该如何解决这个问题?

0 投票
4 回答
4090 浏览

opengl - 与多个纹理混合的 Alpha 留下彩色边框

以下问题:我有两个纹理,我想将这两个组合成一个新的纹理。因此,一个纹理用作背景,另一个将被覆盖。覆盖纹理正在使用 glClearColor(1.0, 1.0, 1.0, 0.0) 进行初始化。对象被绘制到纹理上,这些对象确实具有 alpha 值。

现在在两个纹理之间混合会在对象周围留下一个白色边框。边框来自第二个纹理中的背景颜色是白色的事实,不是吗?

如何在不必考虑叠加纹理的背景颜色的情况下使用 alpha 混合?

0 投票
1 回答
143 浏览

image - 按顺序平均图像

我意识到可能有更好的地方来问这个问题,但我认为你们都会得到一些有价值的反馈。

人们被要求在白色的卡瓦上画一个黑色的形状。然后他们的绘图被添加到运行平均值中。我希望显示图像中最常见的部分,并且与大多数其他图纸不同的图纸部分消失。

我的两个问题是我使用 ImageMagick 来处理图像,这意味着我一次只能创建两个图像的合成。所以我有运行的总图像,以及要添加的最新图像。我无法以这种方式获得真正的平均值。

其次,我不完全理解混合模式,尤其是在涉及不同不透明度的情况下。我不确定哪个最好用。

0 投票
1 回答
2457 浏览

ios - 具有深度测试的 OpenGL 点精灵 - 混合问题?

我正在渲染点精灵(在 iOS 上使用 OpenGL ES 2.0)作为用户的绘图笔画。我将这些点存储在顶点缓冲区对象中,因此我需要执行深度测试,以便精灵在提交绘制时以正确的顺序出现。

在渲染这些绘图笔画时,我看到了一种奇怪的效果,如下面的截图所示:

点精灵混合问题

注意蓝色笔划边缘周围的背景色“边框”,它被绘制在绿色上。用户在绿色笔划之后绘制了蓝色笔划,但是当重新绘制 VBO 时,首先绘制蓝色笔划。在绘制绿色笔划时,深度测试开始进行,并看到它应该在蓝色笔划之后,并且这样做并取得了一些成功。在我看来,这是某种混合问题,还是与错误计算片段着色器中的颜色有关?所有笔划的边缘都应该是透明的,但是片段着色器在处理这些片段时似乎将其与背景纹理结合在一起。

在我的应用程序中,我创建了一个深度渲染缓冲区并glEnable(GL_DEPTH_TEST)使用glDepthFunc(GL_LEQUAL). 我已经尝试过glDepthMask(),但无济于事。混合设置为glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA),并且点精灵颜色使用预乘的 alpha 值。绘图例程非常简单:

  • 绑定渲染到纹理 FBO。
  • 绘制背景纹理。
  • 绘制点精灵(来自许多 VBO)。
  • 将此 FBO 的纹理绘制到主帧缓冲区。
  • 呈现主帧缓冲区。


编辑

这是绘图例程中的一些代码。

绘图前的设置状态:

绘图程序:

谢谢你的帮助。

0 投票
0 回答
416 浏览

ios - 如何设置我的 openGL 混合,以便我可以使用具有一定透明度的 CCSprite 仅在 CCRenderTexture 上的不透明区域上绘制?

由于我使用的混合,我无法使用包含透明度的纹理绘制 CCRenderTexture。

我正在绘制的精灵具有以下混合功能:

glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA).

它正在绘制的渲染纹理具有混合功能:

glBlendFuncSeparate(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA).

渲染纹理设置为大部分是透明的,上面有一些完全不透明的区域。上面的混合函数允许我在纯色区域上绘制一个完全纯色的精灵,而不是在透明区域上绘制。

当我尝试更改我绘制的精灵以包含一些透明度时,就会出现问题。它倾向于“擦除”渲染纹理上的不透明区域。理想情况下,我希望我绘制的精灵上的透明区域没有效果。我想知道openGL混合大师是否能给我一些指导?

澄清一下,我想要达到的最终效果是能够绘制一个包含一些透明区域到我的渲染纹理的精灵。精灵的透明区域不应绘制到我的渲染纹理。如果精灵的不透明区域位于渲染纹理上的不透明区域上,则它们仅应绘制到渲染纹理。