【问题标题】:How do I get a colored texture brush to show up in Open GL ES on white background?如何在 Opengl ES 中以白色背景显示彩色纹理画笔?
【发布时间】:2019-04-22 06:49:11
【问题描述】:

我想使用 OpenGLES 在白色背景上使用我选择的颜色的纹理画笔进行绘制。

我有一个位图图像,我使用 CG 加载并转换为纹理。这个位图大部分是黑色的,但在中心有一个我想用作“画笔”的白色圆圈。换句话说,我希望黑色部分在最终合成中消失,但白色部分呈现我使用 glColor 设置的颜色。

在设置一些不透明的亮色后,我能得到的最好的结果是使用混合参数(GL_SRC_ALPHA、GL_ONE)是灰色(不是纯白色背景)上的褪色线。但是当我将背景设置为纯白色时,这条线是不可见的。

至少在目前的情况下,原始纹理的黑边不会出现。我尝试的大多数其他混合组合要么导致即使在灰色上也没有任何显示,或者看到包括黑色边缘在内的整个画笔,这是不好的。

是否有人愿意向我解释我应该如何设置我的纹理和/或 GL 状态以使明亮的颜色在纯白色上显示出来,而不显示黑色纹理边缘?这可能是一个新手问题,但我已经尝试过混合数学,但我仍然不明白颜色是如何被组合在一起的。

这是我用作画笔的图像:

alt text http://www.coldcoffeeandjuice.com/OpaqueBrush.png

这是一些结果输出,当背景为灰色,glColor4f 设置为 (1, 0, 0, 1),例如纯红色,并且画笔用于一堆连续的 GL_POINT 时。请注意,这样做的好处是只有画笔图像的白色部分显示为红色——没错。不好的部分是我想要纯净明亮的红色由于与背景(?)和/或画笔的白色(?)混合而变得苍白,因此如果背景是纯白色,它就会完全消失.这使用了上面给出的混合参数 (src_alpha, one)。


(来源:coldcoffeeandjuice.com

考虑到纯红色,这就是我想看到的(感谢 Paintbrush):


(来源:coldcoffeeandjuice.com

谁能帮我理解我做错了什么?

谢谢!

【问题讨论】:

  • 你能发布一些图片来展示你期望看到的和你实际看到的吗?
  • 完成。如果我在这里遗漏任何重要信息,请告诉我。我是一名优秀的程序员,但对图形数学和 GL 状态有点陌生。
  • 嗨,Ben,我也在寻找这个解决方案,但我无法使用示例应用程序“GLPaint”获得正确的结果。你能分享你设置OpenGL环境的代码部分吗?
  • 我和奇怪的99在同一条船上。我对 OpenGL 完全陌生,我正在尝试通过逆向工程 GLPaint 在白色背景上绘图。我已经完成了您上面建议的操作,而且我已经完成了 glBlendFunc 的所有组合,以及我能想到的画笔纹理的几乎所有组合(白底黑字、黑底白字、反白底白、别名/否)别名等)。我能达到的最好效果是使用白色反式圆圈,glBlendFunc 如上所述(GL_ SRC_ ALPHA,GL_ ONE_ MINUS_ SRC_ ALPHA),但这仍然给我一个暗淡的颜色,半反式外部位被解释为

标签: iphone opengl-es


【解决方案1】:

好的,所以您尝试使用画笔形状的蒙版将给定颜色(在本例中为“红色”)“绘制”到背景上。

在开始渲染“绘画”之前,您需要执行以下操作:

  1. 首先确保您的画笔具有与其形状相对应的 Alpha 通道 - 即 Alpha 通道应该看起来与您设置的画笔图像相似。

  2. 设置这些状态进行渲染(注意空间以绕过 wiki 标记):

// Make the current material colour track the current color
glEnable( GL_COLOR_MATERIAL );

// Multiply the texture colour by the material colour.
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

// Alpha blend each "dab" of paint onto background
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

另请参阅:
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormaterial.html

http://www.khronos.org/opengles/documentation/opengles1_0/html/glTexEnv.html

【讨论】:

  • 正义——谢谢。这实现了我正在寻找的效果——在查找混合时,我没有提到在 API 中使用“材料”的东西。你能为我解释一下——因为我自己无法弄清楚数学,也无法通过在线搜索找到答案——为什么问题中发布的原始技术的行为方式如此?我想了解那里到底发生了什么。谢谢!
  • 很高兴它对你有用 - 我去年写了一个位图字体渲染器,并以艰难的方式发现了这一切。我真的不能说你的原始代码出了什么问题,因为我不知道你在做什么。如果您好奇,我会(依次)消除我概述的每个步骤并尝试对您的错误进行逆向工程。
  • 我想我应该指出,glTexEnvf 调用启用了重要的“着色”操作。每个纹素乘以当前颜色 - 所以白色 (1,1,1,1) x 颜色 (R,G,B,A) = (R,G,B,A);和黑色 (0,0,0,0) x 颜色 = 黑色 (0,0,0,0)。其他部分只是使着色真正起作用。
  • 谢谢正义。这是我所追求的最后一点着色信息。谢谢!
  • 你好 Justicle,我已经尝试过和作者一样的事情。最后我找到了油漆的例子。在此示例中,我通过在擦除方法 glClearColor(1.0, 1.0, 1.0, 1.0); 中更改清除颜色将背景颜色更改为白色;我已经根据您的建议更改了纹理的混合方法,但我的画笔周围仍然是原始的黑色方块。你能告诉我要检查什么吗?我真的是 OpenGL 的菜鸟,如果我的问题有点愚蠢,对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2012-07-14
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多