4

我正在尝试使用 RGBA 值加载纹理,但 alpha 值似乎只是使纹理更白,而不是调整透明度。我听说过 3D 场景存在这个问题,但我只是将 OpenGL 用于 2D。无论如何我可以解决这个问题吗?

我正在初始化 OpenGL

glViewport(0, 0, winWidth, winHeight);
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, winWidth, 0, winHeight); // set origin to bottom left corner
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 1);

屏幕截图: 那个褪色的点状图像应该是半透明的。黑色位应该是完全透明的。如您所见,它背后有一个图像没有显示出来。

生成该纹理的代码相当长,所以我将描述我所做的。它是一个 40*30*4 类型的 unsigned char 数组。每 4 个字符设置为 128(应该是 50% 透明,对吧?)。

然后我将它传递给这个函数,将数据加载到纹理中:

void Texture::Load(unsigned char* data, GLenum format) {
    glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, _texID);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, format, GL_UNSIGNED_BYTE, data);
    glDisable(GL_TEXTURE_2D);
}

而且...我想我刚刚发现了问题。正在使用以下代码初始化全尺寸纹理:

glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, _texID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_TEXTURE_2D);

但我猜 glTexImage2D 也需要是 GL_RGBA 吗?我不能使用两种不同的内部格式?或者至少不是不同大小的(3字节对4字节)?GL_BGR 即使像这样初始化也能正常工作......

4

3 回答 3

4

为了他人的利益,我在这里发布我的解决方案。

问题是虽然我的 Load 函数是正确的,

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, GL_RGBA, GL_UNSIGNED_BYTE, data);

我将 GL_RGB 传递给这个函数

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);

其中需要指定正确的字节数(四个)。根据我的理解,您不能对 SubImage 使用不同数量的字节,尽管我认为如果它确实具有相同的字节数(即混合and可以,但不是and ) ,您可以使用不同的格式。GL_RGBGL_BGAGL_RGBGL_RGBA

于 2009-04-18T02:31:33.957 回答
1

您的场景中是否有任何重叠的基元?

您知道您正在调用 glColor 的 3 参数版本,它将 alpha 设置为 1.0,对吗?

如果您可以发布屏幕截图或以其他方式描述会发生什么,例如,当您绘制两个具有相同颜色和不同 alpha 的图元时,这可能会有所帮助。事实上,任何演示该问题的代码都会有所帮助。

编辑:

我想使用 TexImage 和GL_RGB(对于internalformat,第三个参数)创建一个没有 alpha 或 alpha 值隐式初始化为 1 的 3 分量纹理,无论您提供什么样的像素数据。

GL_BGR不是此参数的有效值,也许它正在欺骗您的实现使用完整的 4 字节内部格式?(或者一个 2 字节的,根据GL_LUMINANCE_ALPHA)或者你的意思是传递GL_BGR给你的 Texture::Load() 函数,这应该与传递没有什么不同GL_RGB

于 2009-04-17T01:01:43.603 回答
0

我认为这应该可行,但它假设图像具有 alpha 通道。如果您尝试加载没有 alpha 通道的图像,您将收到异常或您的应用程序可能会崩溃。对于非 alpha 通道图像GL_RGBGL_RGBA在设置GL_UNSIGNED_BYTE.

void Texture::Load(unsigned char* data) {
  glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, _texID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  glDisable(GL_TEXTURE_2D);
}
于 2009-04-17T15:30:27.743 回答