2011-01-05 70 views
0

我试图在彩色四边形上方绘制部分透明的纹理,以便颜色透过透明部分,制作轮廓。这是代码: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(); 

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

Screenshot

与对纹理四为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使用纹理而不是四边形进行混合?

回答

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

+0

谢谢,那就是问题所在。 – 2011-01-06 03:31:05