Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使白色透明_C++_Opengl_Textures_Blending - Fatal编程技术网

C++ 如何使白色透明

C++ 如何使白色透明,c++,opengl,textures,blending,C++,Opengl,Textures,Blending,我正在玩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; Imag

我正在玩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;
    };

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

您的混合功能应该是透明的

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

提供
GL\u ONE
作为第二个参数意味着目标颜色值不考虑源alpha值,因此不会发生正确的混合。

您必须解决两个问题:

  • 如果纹理的不同纹理应以不同的方式混合,则必须设置不同的alpha通道。如果像您的情况一样,黑色的纹理应该是不透明的,而白色的纹理应该是不可见的,那么黑色纹理的alpha通道必须设置为255,白色纹理的alpha通道必须设置为0。请注意,任何介于0和255之间的alpha值都会产生或多或少强烈的透明效果

  • 您已将混合函数设置为
    glBlendFunc(GL\u SRC\u ALPHA,GL\u ONE\u减\u SRC\u ALPHA)


  • 混合通过原始目标颜色和源颜色(在您的例子中是纹理的颜色)的函数来计算新的目标颜色(帧缓冲区中的片段颜色)

    如果你设定 使用函数
    (GL\u SRC\u ALPHA,GL\u ONE\u减去\u SRC\u ALPHA)
    ,然后使用 使用公式
    GL\u FUNC\u 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):

    答案的延伸 要将白色纹理的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);
        }
    }
    
    for(i=0;i
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去grc_ALPHA)不起作用。纹理变得不透明。@slowbro可能是因为您将alpha值设置为不透明
    Image[i][j][3]=(GLubyte)255?将其设置为255以下的值。如何在上面的代码中将黑色纹理的alpha通道设置为255,将白色纹理的alpha通道设置为0?
    
    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);
        }
    }