2013-06-19 47 views
2

我使用函数像下面加载两个纹理:忽略某些颜色阿尔法混合

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

第一纹理是地图和我绘制在屏幕上正常。第二个纹理是黑色的,上面有红色文字,这是我想要在地图纹理上绘制的纹理。但是,我想忽略黑色像素,以便它只绘制红色文字。

我画使用下列内容:

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(我宁愿用这个绘制黑色文本像素如果可能的话)

任何想法?

回答

1
glBlendFunc(GL_ONE, GL_DST_ALPHA); 

你为什么要使用目的地阿尔法?源颜色是指颜色是否应该写入的内容;目标颜色的alpha与它无关。

你不会说你的“黑色和红色”纹理是否有alpha通道。所以我会假设它确实或你知道如何正确设置一个。

为了您的需要,您需要基于alpha来在源和目标之间进行线性插值。要做到这一点,你需要使用这样的混合函数:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)。这是两种颜色之间的线性插值。

+0

我尝试了所有这一切,我到处问:http://www.gamedeception.net/threads/26235-Draw-and-Ignore-specific-Colour?p=173131 它没有出来的权利。不,它没有alpha通道,它是24位BMP/Png。尝试了两种格式。 – Brandon

2

正确的做法是使用alpha blendingalpha channel。无论如何,你的纹理可能是32位,完全不透明的alpha channel255。使用你最喜欢的图片编辑器,你可以转换你的图片,将red频道复制到你的alpha频道,这将会为你提供你所需要的。它也将支持半透明纹理。

否则,您正在寻找的是alpha test,除非您使用索引颜色,否则还需要使用alpha通道。