【问题标题】:Transparent textures in OpenGL do not replace quad alphaOpenGL 中的透明纹理不会替换四边形 alpha
【发布时间】:2011-06-03 20:07:50
【问题描述】:

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

// 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 进行混合?

【问题讨论】:

    标签: opengl textures alpha


    【解决方案1】:

    准备好踏上回忆之旅。

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

    里面的 3 是你的问题。参数的右侧部分 (RGBA+UNSIGNED_BYTE) 提到了您的源数据类型。 destination 数据类型是第三个参数(即 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

    【讨论】:

    • 谢谢,这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多