C++ 如何使白色透明
我正在玩OGL的混合。我有白色的背景。我在这个背景上画四方形。四边形由白色和黑色纹理绑定。颜色数组由颜色和alpha值填充: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
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值,因此不会发生正确的混合。您必须解决两个问题:
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);
}
}