【问题标题】:OpenGL Texture with alpha and glColor4f, glColor4f is affecting texture具有alpha和glColor4f的OpenGL纹理,glColor4f正在影响纹理
【发布时间】:2015-03-14 05:43:17
【问题描述】:

我想应用 .tga 文件中包含 Alpha 透明度的纹理。当纹理绑定到对象时,它会显示为对象本身的纯色。我希望颜色消失,或者至少是透明的。如果我将对象颜色更改为透明,那么整个纹理就会变得更加透明,这不是我想要的。

有没有办法关闭颜色,或者如何使 glColor4f 不影响纹理?

void Sector::DrawPlanets(double gameTime){
  glEnable(GL_TEXTURE_2D);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable( GL_BLEND );
  glColor4f(0.0f, 0.0f, 1.0f,0.1f);

  for(std::vector<Planet *>::iterator it = Planets.begin(); it != Planets.end(); it++){
    double x,y,angle;
    (*it)->GetPosition(&x,&y,&angle,gameTime);
    int radius = (*it)->GetRadius();
    glPushMatrix();
    glTranslatef(x,y,0);
    GLUquadricObj * sphere = gluNewQuadric();
    gluQuadricDrawStyle(sphere, GLU_FILL);
    gluQuadricTexture(sphere, GL_TRUE);
    glBindTexture(GL_TEXTURE_2D, get_textures()[static_cast<int>((*it)->GetPlanetZone())]);
    gluSphere(sphere,radius,20,20);
    glPopMatrix();
  }
  glDisable(GL_TEXTURE_2D);
  }

侧面信息 我已经看到加载纹理的方式也可能是问题的罪魁祸首。我也会包括在内。这是我从课堂上得到的代码,这就是我使用 .tga 的原因,因为它已经可以使用了。这是我认为相关的内容,不包括某些功能。

const int num_textures = 5;
static GLuint texName[num_textures];

void InitializeTextures(){
bool repeat[num_textures];
bool border[num_textures];
gliGenericImage *image[num_textures];
int n=0;
repeat[n] = false; border[n] = false;
image[n++] = readImage("ice.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("jupiter.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("world.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("volcanic.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("stars.tga");

if(n!=num_textures)
{
    printf("Error: Wrong number of textures\n");
    _getch();
    exit(1);;
}
glGenTextures(num_textures, texName);

for(int i=0; i<num_textures; i++)
{
    glBindTexture(GL_TEXTURE_2D, texName[i]);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    int repeats = repeat[i];
    int needs_border = border[i]; // Needed if clamping and not filling the whole polygon.
    if(repeats)
    {
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    }
    else
    {
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    }
    if(needs_border)
    {
        // set a border.
        SetBorder(image[i]);
    }

    bool mipmaps = false;
    if(!PowerOf2(image[i]->height) || !PowerOf2(image[i]->width))
    {
        // WARNING: Images that do not have width and height as 
        // powers of 2 MUST use mipmaps.
        mipmaps = true; 
    }

    if (mipmaps) 
    {
        gluBuild2DMipmaps(GL_TEXTURE_2D, image[i]->components,
                image[i]->width, image[i]->height,
                image[i]->format, GL_UNSIGNED_BYTE, image[i]->pixels);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                //GL_LINEAR_MIPMAP_LINEAR);
                GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
                //GL_LINEAR);
                GL_NEAREST);
    } 
    else 
    {
        glTexImage2D(GL_TEXTURE_2D, 0, image[i]->components,
                image[i]->width, image[i]->height, 0,
                image[i]->format, GL_UNSIGNED_BYTE, image[i]->pixels);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    }
}
}

【问题讨论】:

    标签: c++ opengl transparency texture-mapping


    【解决方案1】:

    当你将TEXTURE_ENV_MODE 设置为DECAL 时,你得到的是覆盖颜色的纹理:

    // This is not what you want
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    

    你想要MODULATE,这是默认值,所以只需删除该行。

    请注意,MODULATE 会将颜色乘以纹理,因此如果您希望纹理以全亮度显示,请将颜色更改为白色:

    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    

    【讨论】:

    • 这似乎是正确的方向。我把它注释掉了,看起来图像透明的地方在整个对象上都是透明的,但现在不是纹理的颜色通过,到处都有纹理,它显示为不同深浅的蓝色,这就是 glColor4f 的设置...我将继续尝试根据您对 MODULATE 的评论找出如何使其工作
    • 想通了!您为我指明了正确的方向,但我必须采取不同的方式。我把它改成了:glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
    • 这也行得通——将它留在MODULATE 上很常见,因为MODULATEREPLACE 之间没有性能差异。
    • 我想知道为什么当我把它放在调制时它表现得如此奇怪,一定有其他设置在玩它。那好吧。非常感谢您的帮助。
    • 使用MODULATE,您必须将颜色设置为白色:glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 您将其设置为蓝色glColor4f(0.0f, 0.0f, 1.0f,0.1f);
    【解决方案2】:

    改变

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
    

    【讨论】:

      【解决方案3】:

      只需在这里插话并告诉您,与其使用固定功能纹理环境撕扯头发,您应该简单地放弃整个固定功能混乱并使用着色器。在片段着色器中,您可以准确指定基色和纹理的组合方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        相关资源
        最近更新 更多