Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ OpenGL-启用混合时纹理不可见_C++_Opengl - Fatal编程技术网

C++ OpenGL-启用混合时纹理不可见

C++ OpenGL-启用混合时纹理不可见,c++,opengl,C++,Opengl,当我尝试在对象上显示纹理时,它会起作用,但仅在禁用GL\u混合时才起作用。启用混合时: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 纹理不再可见。黑屏。 我真的不知道发生了什么事。它同样适用于JPG和带有alpha通道的PNG 编辑(更多详细信息): 嗯,很难粘贴代码(对象、对象无处不在和巨大),但它是这样的: //初始化-我评论了所有其他内容 glEnable(GL_BLEND); glBlen

当我尝试在对象上显示纹理时,它会起作用,但仅在禁用
GL\u混合时才起作用。启用混合时:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
纹理不再可见。黑屏。 我真的不知道发生了什么事。它同样适用于JPG和带有alpha通道的PNG

编辑(更多详细信息):

嗯,很难粘贴代码(对象、对象无处不在和巨大),但它是这样的:

//初始化-我评论了所有其他内容

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//准备纹理

glEnable(GL_TEXTURE_2D);
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);

int Mode = GL_BGR;

int nOfColors = image->format->BytesPerPixel;
if (nOfColors == 4) {
    if (image->format->Rmask == 0x000000ff)
        Mode = GL_RGBA;
    else
        Mode = GL_BGRA;
} else if (nOfColors == 3) {
    if (image->format->Rmask == 0x000000ff)
        Mode = GL_RGB;
    else
        Mode = GL_BGR;
}

// glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, image->w, image->h, 0, Mode, GL_UNSIGNED_BYTE, image->pixels);
glDisable(GL_TEXTURE_2D);
//绘图

glColor4f(1.0f,1.0f,1.0f,1.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture( GL_TEXTURE_2D, _i );

glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(x, y);
glTexCoord2f(1, 0);
glVertex2f(x + width, y);
glTexCoord2f(1, 1);
glVertex2f(x + width, y + height);
glTexCoord2f(0, 1);
glVertex2f(x, y + height);
glEnd();

glBindTexture( GL_TEXTURE_2D, NULL );
glDisable(GL_TEXTURE_2D);
编辑2


“黑屏”可能有点让人困惑-我的意思是没有显示任何内容(我的背景是黑色的,但这并不重要)-如果我关闭混合,我会在屏幕上获得很好的纹理-除了背景颜色之外没有任何内容进行混合

似乎你的alpha通道都是0-你确定你正确读取了纹理吗(使用alpha通道)?尝试手动填充,或检查是否确实由用于将文件读入像素的任何软件填充。

是否尝试调用glTexEnvf

glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
下面是一个例子:

对于您的案例,您需要查看以下代码:

//draw texture
glPushMatrix();
glColor4f(1.0, 1.0, 0.0, 1.0);
texture.switchOffTexture();
Sphere.drawObject();  
glTranslatef(0.0, 0.0, 7.0);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
texture.bindTexture();
glBegin(GL_POLYGON);
  glTexCoord2f(0.0, 0.0);
  glVertex3f(-1.0, -1.0, 0.0);  
  glTexCoord2f(1.0, 0.0);
  glVertex3f(1.0, -1.0, 0.0);
  glTexCoord2f(1.0, 1.0);
  glVertex3f(1.0, 1.0, 0.0);
  glTexCoord2f(0.0, 1.0);
  glVertex3f(-1.0, 1.0, 0.0);
glEnd();
glPopMatrix();
如果您在编译方面有问题,可以注释include:#include


按1、2、3选择混合类型。在案例3中,您将看到此结果

,因此在我将图像加载库更改为DevIL后,它最终开始工作。以前的alpha通道似乎存在问题


谢谢大家的帮助

如果你做了
glBlendFunc(GL_SRC_ALPHA,GL_ONE),会发生什么
?您是否有任何GL_DST_ALPHA设置?这需要更多信息。您还绘制了什么。这是场景中唯一的纹理对象,还是在绘制时所有东西都消失了?纹理的ALPHA是什么?尝试调用
glColor4f(1.0、1.0、1.0、1.0)
在渲染纹理之前。已编辑-添加了详细信息。现在进行测试时,我只有一个带有纹理的对象(rect)。glBlendFunc(GL_SRC_ALPHA,GL_one);给我相同的黑色sceen glBlendFunc(GL_one,GL_one);给我纹理,但它显然没有用处:)glColor4f(1.0,1.0,1.0);在准备纹理并将其绑定以进行渲染时,是否一直存在?在准备纹理并将其绑定以进行渲染时,没有输出有用的内容?这将是一个更好的被接受的答案,因为它实际上提供了与问题中显示的代码相关的精确解决方案。仅对其进行一点扩展:默认的GL_纹理ENV_模式是GL_调制,因此将其更改为GL_替换是使用纹理绘制全屏四边形的最有意义的方法。将fg颜色设置为白色也适用于GL_MODULATE,但这可能仅仅是一种解决方法。