OpenGL 半透明纹理超过其他纹理

标签 opengl transparent textures translucency

我得到了 2 个 png 图像,在 Qt/C++ 2D OpenGL 应用程序中用作纹理。第一个用作某种“中间”地面,第二个用作“在顶部”渲染的“对象”(注意:它们都具有相同的 z 值 atm,我得到所需的行为是在一个定义的顺序)。 “对象”纹理部分是半透明的。 “中间地带”纹理大多是实心的。
问题是,我的“对象”纹理的半透明部分是纯背景色,而不是“中间背景”纹理。

任何提示如何实现这一目标?

以下 OpenGL 标记用于我的纹理渲染

glEnable (GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

谢谢你的帮助。

编辑:

更多代码:
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);

glEnable(GL_TEXTURE_2D);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D, c->_texture);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glBegin(GL_QUADS);
{
    glTexCoord2i(0,0);
    glVertex2i(-128,-128);

    glTexCoord2i(0,1);
    glVertex2i(-128,128);

    glTexCoord2i(1,1);
    glVertex2i(128,128);

    glTexCoord2i(1,0);
    glVertex2i(128,-128);

}
glEnd();

glDisable(GL_TEXTURE_2D);

glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);

编辑:我如何加载我的纹理,据我所知它是用 alpha channel 加载的
QImage img("./images/dummycar.png","PNG");
QImage t(QGLWidget::convertToGLFormat(img));
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

截图:http://img824.imageshack.us/img824/1912/blackbox.png

Skyimage 是“中间地带”,背景是纯黑色。

最佳答案

glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits() );

您正在指定 3 internalFormat 的 channel ,所以这是 RGB,而不是 RGBA。尝试使用 GL_RGBA而是在那个位置。

关于OpenGL 半透明纹理超过其他纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163862/

相关文章:

opengl - 无法从附加到 FBO 的深度纹理读取深度值

linux - Emscripten 和空方 block

android - Android Lollipop 中的通知背景是白色的。我怎样才能改变它?

c++ - Targa 运行长度编码

textures - libgdx 粒子效果可以使用纹理区域吗?

java - LibGDX "GwtApplication: exception: Couldn' t 加载图像 'a.jpg'

python - 使用 Pyglet 进行 OpenGL 拾取

opengl - 绘制相交圆的轮廓

java - 制作带有可见边框的透明 JFrame

uilabel - 为 iPhone 应用程序的 UILabel 设置透明背景