c++ - 忽略某些颜色 Alpha 混合

标签 c++ opengl

我使用如下函数加载两个纹理:

GLuint LoadImage(std::string ImageTitle, GLenum Target)
{
    Image Img(ImageTitle.c_str());
    std::vector<std::uint8_t> Buffer, Out(((Img.Width() * Img.GetBitsPerPixel() + 31) / 32) * 4 * Img.Height());
    ImageToBuffer(Buffer, Img);
    FlipImageBytes(Buffer.data(), Out.data(), Img.Width(), Img.Height(), Img.GetBitsPerPixel());

    GLuint ID;
    glGenTextures(1, &ID);
    glBindTexture(Target, ID);
    glTexParameteri(Target, GL_TEXTURE_WRAP_S, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_WRAP_T, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(Target, 0, Img.GetBitsPerPixel() == 32 ? GL_RGBA : GL_RGB, Img.Width(), Img.Height(), 0, Img.GetBitsPerPixel() == 32 ? GL_BGRA : GL_BGR, GL_UNSIGNED_BYTE, Out.data());
    return ID;
}

第一个纹理是 map ,我通常将其绘制在屏幕上。第二个纹理是黑色,上面有红色文本,这就是我想在 map 纹理上绘制的纹理。但是,我想忽略黑色像素,以便它只绘制红色文本。

我使用以下方法进行绘制:

void DrawTexture(GLenum Target, GLuint ID, float X1, float Y1, float X2, float Y2, int Width = 1, int Height = 1)
{
    //glEnable(Target);
    //glBindTexture(Target, ID);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0);
        glVertex2f(X1, Y1);

        glTexCoord2f(0, Height);
        glVertex2f(X1, Y2);

        glTexCoord2f(Width, Height);
        glVertex2f(X2, Y2);

        glTexCoord2f(Width, 0);
        glVertex2f(X2, Y1);
    glEnd();
    glDisable(Target);
}


int X1 = 0, Y1 = 0, X2 = 512, Y2 = 512;
            glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glPushMatrix();


            //Draw MAP.
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, ID);
            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

            glEnable(GL_BLEND);
            glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
            DrawTexture(GL_TEXTURE_2D, MAPID, 0, 0, 512, 512);
            glFlush();


            //Draw TEXT..
            glBindTexture(GL_TEXTURE_2D, ID2);
            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glBlendFunc(GL_ONE, GL_DST_ALPHA);
            DrawTexture(GL_TEXTURE_2D, TEXTID, 0, 0, 512, 512);

            glDisable(GL_BLEND);
            glDisable(GL_TEXTURE_2D);

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

我正在尝试做的事情:

std::vector<std::uint8_t> Buffer; 
    //Fill Buffer with Pixels. 

    glDrawPixels(Width, Height, .........);

enter image description here

但是,它不会使第二个图像上的黑色像素变得透明。如何让它仅在第二个纹理中绘制除黑色之外的每个像素?因此,正常绘制第一个纹理并忽略黑色绘制第二个纹理。

我尝试使用 glDrawPixels(如果可能的话,我更愿意使用它来绘制黑色文本像素)

有什么想法吗?

最佳答案

执行此操作的正确方法是使用 alpha blending ,带有 alpha channel 。无论如何,您的纹理可能是 32 位,在 255 处具有完全不透明的 alpha channel 。使用您最喜欢的图片编辑器,您可以转换图片以将red channel 复制到您的alpha channel ,这将为您提供所需的信息。它还将支持半透明纹理。

否则,您要查找的是 alpha test这还需要使用 alpha channel ,除非您使用索引颜色。

关于c++ - 忽略某些颜色 Alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17180926/

相关文章:

c++ - OpenGL三角形未绘制

c++ - 如何绘制台球 table 口袋 opengl C++

c++ - 在 GLSL 中优化光线追踪着色器

c++ - 具有固定纵横比的透视图(1 :1) in OpenGL and Qt5 (QGLWidget)

c++ - 如何模拟采用已定义的 lambda 函数并覆盖 lambda 函数的函数

c++ - 如何纠正编译OpenCV时的 "undefined reference"错误?

c++ - 如何创建一个一维数组来容纳多个二维数组?

C++ - 当您用 float 索引数组时会发生什么?

c++ - C 或 C++ 中的单引号与双引号

opengl - 使用 ocamlbuild 构建 SDL 和 OpenGL 应用程序