在OpenGL ES中屏蔽

时间:2010-06-23 13:45:26

标签: iphone opengl-es masking blending

阅读关于Nehe的#20教程以及关于屏蔽的问题,我使用黑白图像和不透明图像实现了屏蔽,但结果完全不符合预期(我在iPhone上使用OpenGL ES 1,所以可以不使用着色器。
Source+Mask=Result
从结果图片可以看出,面具上的白色是不透明的,什么是黑色不是源颜色,而是白色(!) 这是我用来渲染它的源代码:

    // we render from one big texture using coordinates
    // so changing rectangle will change the drawn image
    _pressedFrame = maskRect;
    glBlendFunc(GL_DST_COLOR,GL_ZERO);
    [super render:sender];

    _pressedFrame = normalRect;
    glBlendFunc(GL_ONE,GL_ONE);     
    [super render:sender];

// we render from one big texture using coordinates // so changing rectangle will change the drawn image _pressedFrame = maskRect; glBlendFunc(GL_DST_COLOR,GL_ZERO); [super render:sender]; _pressedFrame = normalRect; glBlendFunc(GL_ONE,GL_ONE); [super render:sender];

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

为了使NeHe教程中的技术正常工作,源图像的背景(即掩模图像为白色的任何地方)需要全黑。虽然从你的第一张图片中可以看出来源不是很明显,但我怀疑它在最终图像中变亮的地方并不是黑色。

但是,在OpenGL ES 1.1中不需要以这种方式进行屏蔽。您可以使用多重纹理在一次通过中使用alpha蒙版渲染图像。此外,如果您的面具和图像总是被绘制在一起,那么最好将它们烘焙成单个RGBA纹理 - 不需要多重纹理。