Rol*_*sen 0 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();
Run Code Online (Sandbox Code Playgroud)
纹理是黑色的,除了它有一个城堡的轮廓; 那部分是透明的(和白色).因此,预期的行为是带有绿色轮廓的黑色矩形.我得到的是一个带有白色轮廓的绿色矩形:
这是纹理四边形上的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用于混合吗?
准备好沿着记忆之路旅行.
glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);
Run Code Online (Sandbox Code Playgroud)
你的问题就是那3个.参数的右侧部分(RGBA + UNSIGNED_BYTE)提到了源数据类型.该目标数据类型是第三个参数(即什么GL将你的纹理存储为).
碰巧的是,当创建GL 1.0时,纹理化更简单一些.因此,仅需要参数来指定最终纹理所需的通道数,并使用映射
1=GL_LUMINANCE
2=GL_LUMINANCE_ALPHA
3=GL_RGB
4=GL_RGBA
Run Code Online (Sandbox Code Playgroud)
我相信这种用法是沮丧的,但正如你所看到的,仍然有效.
所以...你的纹理存储为GL_RGB,没有alpha.
其余的是规范的简单应用.替换纹理与内部格式RGB final_color=texture_color
和final_alpha=fragment_alpha
(在您的情况下也来自glColor的源).有关基于内部格式的纹理环境的完整表格,请参见此手册页.