1
votes

I am given a constantly changing/updated buffer and I need to blit this buffer's pixels to the screen. For my test code, I read a bitmap and stored it into a buffer. The thing is, I want to ignore a specific colour when blitting it to the screen using OpenGL.

Currently I use:

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);

So in the above, what I have is some Buffer pointer called Data. I then loop through it given a height and width. If the colour is black, I don't draw it.. Otherwise I use glDrawPixels in combination with glRasterPos2i to draw it to the screen one pixel at a time. Is there a more efficient way I can make it draw all pixels except a specific colour? It is a buffer not a texture. I used Bmp as an example.

1

1 Answers

0
votes

You can use the Stencil buffer. There are also some ways to do chroma key by using the pixel shader.