如何使白色透明

问题描述 投票:4回答:2

我正在玩OGL的混音。我有一个白色背景。我在这个背景上绘制四边形。四边形采用白色和黑色纹理绑定。颜色数组填充颜色和alpha值:

for (i = 0; i < IMAGE_WIDTH; i++) {
    for (j = 0; j < MAGE_HEIGHT; j++) {
        c = ((((i&0x8)==0)^((j&0x8))==0))*255;
        Image[i][j][0] = (GLubyte) c;
        Image[i][j][1] = (GLubyte) c;
        Image[i][j][2] = (GLubyte) c;
        Image[i][j][3] = (GLubyte) 255;
    };

显示纹理四边形:

glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);    
glDisable (GL_DEPTH_TEST);                                              

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texCheck);        

glLoadIdentity();                                                                      
glTranslatef (0.0f, 0.0f, -9.0f);

glBegin (GL_QUADS);    
    glColor3f (1.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 0.0); glVertex3f(-5.0f, -5.0f, 0.0f);
    glTexCoord2f(0.0, 1.0); glVertex3f( 5.0f, -5.0f, 0.0f);
    glTexCoord2f(1.0, 1.0); glVertex3f( 5.0f, 5.0f, 0.0f);
    glTexCoord2f(1.0, 0.0); glVertex3f(-5.0f, 5.0f, 0.0f);
glEnd();

glDisable(GL_TEXTURE_2D);
glEnable (GL_DEPTH_TEST);                                              
glDisable (GL_BLEND);  

四边形上的绑定纹理的黑色是不可见的并且工作正常。我该怎么做才能使粘合纹理的白色透明,而粘合纹理的黑色不透明。

c++ opengl textures blending
2个回答
1
投票

你必须解决2个问题:

  1. 如果纹理的不同纹理元素应以不同方式混合,则必须设置不同的Alpha通道。如果在您的情况下,黑色纹理像素应该是不透明的并且白色纹理像素应该是不可见的,那么黑色纹理像素的alpha通道必须设置为255并且白色纹理像素的alpha通道必须设置为0。请注意,0到255之间的任何alpha值都会产生透明效果,这种效果或多或少都很强。
  2. 你已经将混合函数设置为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

混合通过原始目标颜色和源颜色(在您的情况下是纹素的颜色)的函数计算新的目标颜色(帧缓冲区中的片段颜色)。

如果你使用函数glBlendFunc设置(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)并使用glBlendEquation和方程GL_FUNC_ADD(这是默认值),那么目标颜色计算如下:

C_dest_new = C_src * A_src + C_dest * (1-A_src)

如果alpha通道等于0.0:

C_dest_new = C_src * 0 + C_dest * (1-0) = C_dest

如果alpha通道等于1.0(255):

C_dest_new = C_src * 1 + C_dest * (1-1) = C_src    

Extension to the answer

要将白色纹理像素的alpha通道设置为0,生成纹理的代码必须以某种方式更改,如下所示:

for (i = 0; i < IMAGE_WIDTH; i++) {
    for (j = 0; j < MAGE_HEIGHT; j++) {
        c = ((((i&0x8)==0)^((j&0x8))==0))*255;
        Image[i][j][0] = (GLubyte) c;
        Image[i][j][1] = (GLubyte) c;
        Image[i][j][2] = (GLubyte) c;
        Image[i][j][3] = (GLubyte) (255 - c);
    }
}

2
投票

你的混合功能应该是

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

提供GL_ONE作为第二个参数意味着在不考虑源alpha值的情况下获取目标颜色值,因此不会发生正确的混合。

© www.soinside.com 2019 - 2024. All rights reserved.