OpenGL位图alpha缓冲区

时间:2015-09-21 19:24:17

标签: opengl

我有两个相同场景的RGBA图像(GL_UNSIGNED_BYTE类型的简单2D光栅,不是纹理或任何东西),一个是锐利的,一个是模糊的。在显示模糊图像的情况下,我需要创建一种效果,其中清晰图像在一个或多个(可能重叠的)圆形区域中显示,与圆周边缘周围的背景模糊图像平滑地混合。我曾经做过以下事情。

在初始化时调用它:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

对于每个圆圈,制作清晰图像的副本,为其alpha分量指定新值,从圆圈中心的255开始,朝向边缘将其减小为0。然后使用glDrawPixels()逐个渲染它们,从模糊图像开始。它有效,但随着这些圆形区域的数量增加,它的速度明显变慢。

我正在考虑使用一些alpha缓冲区(不知道正确的术语),因此我在中间创建一个带有切出的alpha圆的小图像,在帧缓冲区的一个或多个位置渲染其alpha分量然后以某种方式将模糊图像和清晰图像与预渲染的alpha值混合。所以我在display()函数中写了这个:

//render the alpha-mask first, at one place for now
GLfloat rp[4];
glGetFloatv(GL_CURRENT_RASTER_POSITION, rp);

glRasterPos2f(0.2f, 0.2f); //just some arbitrary coordinates on the screen
glColorMask(false, false, false, true); //think I only need the alpha-channel
glBlendFunc(GL_ONE, GL_ZERO);
glDrawPixels(sharp_mask_width, sharp_mask_height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_mask);

//render the blurred image, blending the  the previously rendered alpha
glRasterPos2f(rp[0], rp[1]);

glColorMask(true, true, true, true); //all channels
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA); //make a hole where alpha mask had the maximum alpha
glDrawPixels(g_width, g_height, GL_RGBA, GL_UNSIGNED_BYTE, imageDataBlurred);

glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
glDrawPixels(g_width, g_height, GL_RGBA, GL_UNSIGNED_BYTE, imageDataSharp);
glFlush();

似乎我不明白所有这些混合的东西都很重要,因为根本没有渲染,我得到的只是一个空屏幕。我得到的是一个远远类似于我需要的效果,搞乱glBlendFunc参数并混合rgb-s而不是alpha-s。

如果可以的话,怎么办呢?

我知道我可能会在2015年使用过时的OpenGL,当时可编程着色器统治世界并治愈癌症,但是如果可能的话,我更倾向于回答描述如何在旧的样式OpenGL,所以我不必过多地改变传统程序的废话......

0 个答案:

没有答案