我试图在彩色四边形上方绘制部分透明的纹理,以便颜色透过透明部分,制作轮廓。这是代码:OpenGL中的透明纹理不能代替四角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();
纹理是黑色的,除非它具有城堡的轮廓;该部分是透明的(和白色)。因此,预期的行为是一个带有绿色轮廓的黑色矩形。我得到的却是一个绿色的矩形白色轮廓:
与对纹理四为0.5 Alpha的。如果我把它设置为1.0,我会回复没有透明度的纹理,就像(哦,不能将第二个截图作为链接发布;它在s330.photobucket.com/albums/l412/TWBWar/?action =查看& current = replace10.png)。随着alpha为0,我得到一个绿色的矩形。因此,在我看来,纹理四边形正在使用glColor4d设置的alpha值进行混合,而不是来自纹理的值,这是我对GL_REPLACE的期望。 (我也尝试过使用GL_DECAL和GL_MODULATE,但我无法获得我想要的行为。)任何人都可以告诉我如何让OpenGL使用纹理而不是四边形进行混合?
谢谢,那就是问题所在。 – 2011-01-06 03:31:05