- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 alhpa 掩码与 glAlphaBlend 及其所有参数一起使用。我在 stackoverflow 上找到了很多类似的答案,但我什么都没意识到。
我有三张图片,背景 (1)、蒙版 (2) 和文本 (3)。
我想要的是绘制背景,将我的蒙版减去文本,最终得到图像(A)。
Draw background
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
glBegin(GL_QUADS);
glColor4ub(0,0,0,255);
glVertex2d(mxIncrust0 - bgwidth, myIncrust0);
glVertex2d(mxIncrust0, myIncrust0);
glVertex2d(mxIncrust0, myIncrust0 + textheight);
glVertex2d(mxIncrust0 - bgwidth, myIncrust0 + textheight);
glEnd();
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ZERO, GL_ONE);
Draw Text
但一切正常!
实现它的真正方法是什么?
我的问题是不同的,因为它不是基于 OpenGL ES 而只是 Open GL。
最佳答案
完成此操作的“真正方法”是使用 shader programs和 modern OpenGL .你为什么使用那个已弃用的 API?我们在 2014 年使用 OpenGL 4.5 作为最新版本。你甚至不能声称你关心向后兼容性,因为即使是一些非常老的卡(嗯,5 岁)今天支持至少 GL 3.2 是完全可编程的。你知道吗,即使使用 GL 2.0,你仍然可以使用着色器,但是如果你计划在不久的将来为你的生活编写 OpenGL 代码,那么使用已弃用的 API 会让你无处可去。
现在,使用着色器、 mask 是最琐碎的任务之一。您通常会将 2 个纹理传递到片段着色器中。1 - 漫反射纹理(覆盖表面的实际纹理)2 - mask 纹理(可能是单 channel 灰度纹理)
片段着色器看起来像这样:
#version 150
uniform sampler2D maskTex;
uniform sampler2D colorTex;
out vec4 colorOut;
in smooth vec2 texCoords;
void main(){
vec4 color = texture(colorTex,texCoords);
vec4 mask = texture(maskTex,texCoords);
colorOut =vec4(color.rgb,color.a * mask.r);//alpha value can be in any channel ,depends on texture format.
}
尽可能简单。希望对您有所帮助。
P.S 确保你也对 alpha 纹理进行 mipmap,以防漫反射纹理被 mipmap。另请注意,我的示例并不是为了解决您的特定任务,而是向您展示如何在可编程 OpenGL 中完成基本掩码。从这里可以很容易地弄清楚要做什么 ;)
附录:
下面的评论中有人想知道为什么人们会想要使用额外的纹理来保存 alpha 蒙版数据。这是我的答案:
在许多复杂的应用程序中,用户使用称为 alpha 贴图的附加纹理来屏蔽主纹理的像素,同时在此过程中考虑该纹理的 alpha,并且没有理由将 alpha channel “合并”到一个纹理贴图中因为它需要一个额外的步骤和浪费运行时间而没有真正的目的。在一些复杂的渲染场景中,这些 alpha 贴图只能在不同的渲染过程中根据请求生成,然后提取到片段着色器中以供最终使用。所以在这种情况下,应用程序甚至在运行时之前都没有该数据。此外,许多不同的颜色纹理可能需要相同的 alpha 蒙版。那么将它合并到所有这些中是否有意义?当然不是。与在 CPU 上合并透明度数据只是为了避免额外的纹理采样相比,上述做法是众所周知的并且非常有效。
关于OpenGL 阿尔法 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25788952/
我正在尝试将 alhpa 掩码与 glAlphaBlend 及其所有参数一起使用。我在 stackoverflow 上找到了很多类似的答案,但我什么都没意识到。 我有三张图片,背景 (1)、蒙版 (2
说真的,我正在使用 ggplot2,我相信我已经尝试在每个可以想象的地方粘贴 alpha = .5 没有任何效果。 我想为该图中的点添加透明度,因为它们完全覆盖了箱线图 g sessionInfo(
在as3中,是否有实用程序或函数可以将RGB颜色(例如0xFF0000)和alpha值(例如0.5)转换为A 32位ARGB值? 从 ARGB 到 RGB + alpha? 一些解释:位图数据可以在其
请原谅我使用翻译器。 我是编程初学者。 几十年的circlemud正在被改造。虽然已经本地化,可以在VC6.0中实现,没有任何问题,但是随着迁移到VS Community 2019,韩文名字的输入出现
我知道如何设置 pygame.Surface 或 pygame.image 的 alpha。那将是: surface.set_alpha(alpha) 但是如何对由创建的标签执行此操作 label =
这是我的第一篇文章,希望有格式化代码的功能,如果没有的话,抱歉!我用了大约 5 周的时间迈出了使用 tensorflow 的第一步。现在我想尝试一下tensorflow 2.0。我知道我可以使用 1.
应用是否可以判断应用是在Google Play的什么环境下发布的? 我想知道该应用程序是位于 alpha、beta 还是生产 channel ,因此我可以为每个环境使用不同的 API url,如下所示
我在 Bootstrap 4 (Alpha 3) Card Colums 中使用并尝试自定义列数。 Docs 中有以下示例: .card-columns { @include media-
我正在为一个非关键项目尝试 Bootstrap 4 alpha 6,并遇到了一些奇怪的行为。应该并排显示的折叠 div 在展开时会堆叠起来。 以下是重现问题的具体步骤(请参阅下面的完整工作示例): 创
我是一名优秀的程序员,十分优秀!