代码之家  ›  专栏  ›  技术社区  ›  slowbro

如何使白色透明

  •  4
  • slowbro  · 技术社区  · 8 年前

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

    四边形上绑定纹理的黑色是不可见的,效果很好。我该怎么做才能使装订纹理的白色透明,而装订纹理的黑色不透明。

    2 回复  |  直到 8 年前
        1
  •  2
  •   user7860670    8 年前

    你的混合函数应该是

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    

    供应 GL_ONE

        2
  •  1
  •   Rabbid76    7 年前

    您必须解决两个问题:

    1. 如果纹理的不同纹理应以不同的方式混合,则必须设置不同的alpha通道。如果像您的情况一样,黑色的纹理应该是不透明的,而白色的纹理应该是不可见的,那么黑色纹理的alpha通道必须设置为 白色纹理的alpha通道必须设置为 0 255 产生或多或少强烈的透明效果。

    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    
    

    答案的扩展

    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);
        }
    }
    
    推荐文章