更好的方法来忽略特定的颜色 - Blit

时间:2013-07-12 07:25:31

标签: c++ opengl

我得到一个不断变化/更新的缓冲区,我需要将此缓冲区的像素blit到屏幕上。 对于我的测试代码,我读取了一个位图并将其存储到缓冲区中。 问题是,我想在使用OpenGL将其显示到屏幕时忽略特定的颜色。

目前我使用:

glPushMatrix();
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor4f(1.0f, 1.0f, 1.0f, 0.0f);
unsigned char* Data = (unsigned char*)Buffer;

for (int I = Bmp.Height(); I > 0; --I)
{
    for (int J = 0; J < Bmp.Width(); ++J)
    {
        if (Data[0] != 0 && Data[1] != 0 && Data[2] != 0) //If the colour is black, we don't draw it..
        {
            glRasterPos2i(J, I);
            glDrawPixels(1, 1, GL_BGR, GL_UNSIGNED_BYTE, Data);

        }

        Data += Bmp.Bits() == 32 ? 4 : 3;

        if(Bmp.Bits() == 24)
            Data += (-Bmp.Width() * 3) & 3;
    }
}

glPopMatrix();
SwapBuffers(DC);
Sleep(1);

所以在上面,我所拥有的是一些名为Data的Buffer指针。然后我给出了它的高度和宽度。如果颜色是黑色,我不会画它..否则我将glDrawPixelsglRasterPos2i结合使用,一次一个像素地将它绘制到屏幕上。有没有一种更有效的方法可以让它绘制除特定颜色之外的所有像素?它是缓冲区而不是纹理。我以Bmp为例。

1 个答案:

答案 0 :(得分:0)

您可以使用Stencil缓冲区。还有一些方法可以使用像素着色器来进行色度键。