OpenGL中的透明纹理不会替换四元组

时间:2011-01-05 06:32:39

标签: opengl textures alpha

我正在尝试在彩色四边形上方绘制部分透明的纹理,以便颜色透过透明部分,形成轮廓。这是代码:

// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);    
glBindTexture(GL_TEXTURE_2D, 0); 
glBegin(GL_QUADS);
  glVertex3d(coords11.first, coords11.second, -0.001);
  glVertex3d(coords12.first, coords12.second, -0.001);
  glVertex3d(coords21.first, coords21.second, -0.001);
  glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();

// Textured quad    
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]); 
glBegin(GL_QUADS);
  glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0);
  glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0);
  glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0);
  glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0);
glEnd();

纹理是黑色的,除了它有一个城堡的轮廓;那部分是透明的(和白色)。因此,预期的行为是带有绿色轮廓的黑色矩形。我得到的是一个带有白色轮廓的绿色矩形:

Screenshot

将纹理四边形上的alpha设置为0.5。如果我把它设置为1.0,我会恢复没有透明度的纹理,因为(哦,好吧,不能发布第二个截图作为链接;它是在s330.photobucket.com/albums/l412/TWBWar/?action =查看&安培;电流= replace10.png)。当alpha为0时,我得到一个绿色矩形。因此在我看来,使用glColor4d设置的alpha值来混合纹理四边形,而不是纹理中的值,这是我对GL_REPLACE的预期。 (我也尝试过GL_DECAL和GL_MODULATE,但是我无法得到我想要的行为。)谁能告诉我如何让OpenGL使用纹理,而不是四边形,alpha用于混合?

1 个答案:

答案 0 :(得分:9)

准备好沿着记忆之路旅行。

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);

那里有3个你的问题。参数的右侧部分(RGBA + UNSIGNED_BYTE)提到了源数据类型。 目的地数据类型是第三个参数(即GL将纹理存储为什么)。

实际上,当创建GL 1.0时,纹理化更简单一些。因此,仅需要参数来指定最终纹理所需的通道数,并使用映射

1=GL_LUMINANCE
2=GL_LUMINANCE_ALPHA
3=GL_RGB
4=GL_RGBA

我相信这种使用是不受欢迎的,但正如你所看到的,仍然有用。

所以...你的纹理存储为GL_RGB,没有alpha。

其余的是规范的简单应用。对具有内部格式RGB的纹理进行替换final_color=texture_colorfinal_alpha=fragment_alpha(在您的情况下也称为来自glColor的源)。有关基于内部格式的纹理环境的完整表格,请参阅this man page