【问题标题】:Partly Transparent HUD-style overlay in OpenGLOpenGL中的部分透明HUD样式覆盖
【发布时间】:2012-11-02 01:53:34
【问题描述】:

我正在尝试制作一个程序,在背景中显示一个红色旋转立方体,上面覆盖有纹理四边形。

纹理是一个简单的 24 位位图,由白色背景上的黑色单词“Hello World”组成。我希望白色背景是透明的,以便可以在覆盖层后面看到立方体。图像加载器会检查每个像素的值并添加相关的 alpha 值以将图像转换为 32 位位图。

目前,我的程序以黑色文本显示叠加层,但背景为红色,与立方体颜色相同。下面是用于初始纹理设置的代码:

if (bitmap->Load("test.bmp")) {
   glGenTextures(1, &texture);
   glBindTexture(GL_TEXTURE_2D, texture);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmap->GetWidth(), bitmap->GetHeight(),
      0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->GetPixelData());
}

这就是我的全部显示功能,以防有任何干扰。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40, 1, 0.1, 27.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glTranslatef(0.0, 0.0, -1.1);
glRotatef(angle, 1.0, 1.0, 0.0);
glutSolidCube(0.1);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 640, 480, 0.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_CULL_FACE);

glClear(GL_DEPTH_BUFFER_BIT);

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, texture);

glBegin(GL_QUADS);
   glTexCoord2d(0.0, 0.0); glVertex2f(0.0, 0.0);
   glTexCoord2d(1.0, 0.0); glVertex2f(320.0, 0.0);
   glTexCoord2d(1.0, 1.0); glVertex2f(320.0, 240.0);
   glTexCoord2d(0.0, 1.0); glVertex2f(0.0, 240.0);
glEnd();

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

glFlush();
glutSwapBuffers();

【问题讨论】:

    标签: c++ opengl hud


    【解决方案1】:

    默认纹理环境是GL_MODULATE,它将当前颜色(来自立方体的红色)与传入的纹素值混合。

    在渲染文本之前切换到GL_DECAL 或执行glColor3ub(255,255,255)

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2018-07-08
      • 2017-01-18
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多