0

当我尝试在对象上显示纹理时,它可以工作,但仅限于GL_BLEND禁用。当我启用混合时:

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

“黑屏”可能有点令人困惑 - 我的意思是什么都没有显示(我的背景是黑色的,但没关系) - 如果我关闭混合,我会在屏幕上获得很好的纹理 - 除了背景颜色之外什么都没有混合

4

3 回答 3

1

您是否尝试调用 glTexEnvf?

glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

这是示例:http ://unick-soft.ru/art/files/basicBlend.zip

对于您的情况,您需要查看以下代码:

//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 < gl\glux.h >

按 1、2、3 选择混合类型。在案例 3 中,您将看到此结果http://unick-soft.ru/art/img/blend/text_blend.png

于 2013-01-10T22:24:23.943 回答
0

似乎您的 Alpha 通道全为 0 - 您确定您正在正确读取纹理(使用 Alpha 通道)吗?尝试手动填充它或检查它是否真的被您用来将文件读取为像素的任何软件填充。

于 2013-01-10T21:57:35.473 回答
0

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

感谢你的帮助

于 2013-01-11T11:52:12.243 回答