我想使用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)。
这是我想看的东西,给出纯红色(感谢画笔):
任何人都可以帮我理解我做错了吗?
谢谢!
答案 0 :(得分:3)
好的,所以你试图将一个给定的颜色(在这种情况下是“红色”)“涂抹”到背景上,使用一个掩模作为画笔形状。
在开始渲染“paint”之前,您需要执行以下操作:
首先确保您的画笔具有与其形状对应的Alpha通道 - 即Alpha通道看起来应与您提供的画笔图像类似。
使用这些状态设置渲染(注释空间以绕过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