如何在白色背景上的Open GL ES中显示彩色纹理画笔?

时间:2009-09-14 00:21:32

标签: iphone opengl-es

我想使用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)。

alt text
(来源:coldcoffeeandjuice.com

这是我想看的东西,给出纯红色(感谢画笔):

alt text
(来源:coldcoffeeandjuice.com

任何人都可以帮我理解我做错了吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

好的,所以你试图将一个给定的颜色(在这种情况下是“红色”)“涂抹”到背景上,使用一个掩模作为画笔形状。

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

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

  2. 使用这些状态设置渲染(注释空间以绕过wiki标记):

  3. // 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