Warm tip: This article is reproduced from serverfault.com, please click

其他-OpenGL Alpha遮罩

(其他 - OpenGL Alpha Mask)

发布于 2014-09-11 13:37:26

我正在尝试对glAlphaBlend及其所有参数使用Alhpa遮罩。我在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。

Questioner
Maypeur
Viewed
11
Maypeur 2014-09-23 22:20:49

我终于找到了glClipPlane的解决方案,因为它不是纹理,所以我没有使用着色器找到任何解决方案。

那么它是如何工作的呢?1)我画我的背景(四边形,线条...)2)我定义并激活一个限制,在左边没有画一个极限,在右边画一个没有之上的极限3)我画了我需要的一切(正方形,线条,我的文字...)4)我禁用剪辑。

// Draw the background
double* leftMask = new double[4];
leftMask[0] = 1;
leftMask[3] = -mClipXL; // Be careful to use -Limit for the left limit
glClipPlane(GL_CLIP_PLANE0, leftMask);
delete[] leftMask;
glEnable(GL_CLIP_PLANE0);

double* rightMask = new double[4];
rightMask[0] = -1;  // Be careful to use -1 for the right limit
rightMask[3] = mClipXR;
glClipPlane(GL_CLIP_PLANE1, rightMask);
delete[] rightMask;
glEnable(GL_CLIP_PLANE1);

// draw the text

// disable the clip to draw anything else.
glDisable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE1);

运行的很好!!!