3

如何使用带有 Alpha 通道的图像?从现在开始我已经尝试过这个:

glTexImage2D(GL_TEXTURE_2D,
             0,
             GL_RGBA,
             width, height,
             0,      
             GL_BGRA,
             GL_UNSIGNED_BYTE,
             bits);

使用这个 opengl 命令:

glBindTexture(GL_TEXTURE_2D, texgun5);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glColor3f(1.0f, 1.0f, 1.0f);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0);
        glVertex3f(gun5[0], gun5[1], gun5[2]);
        glTexCoord2f(1.0, 0.0);
        glVertex3f(gun5[3], gun5[4], gun5[5]);
        glTexCoord2f(1.0, 1.0);
        glVertex3f(gun5[6], gun5[7], gun5[8]);
        glTexCoord2f(0.0, 1.0);
        glVertex3f(gun5[9], gun5[10], gun5[11]);
    glEnd();
glDisable(GL_BLEND);

我使用的是用 Freeimage 加载的 png 图像,但是透明像素都是黑色的,错误在哪里?

4

3 回答 3

1

我认为您忘记在纹理环境中指定混合。在你的 glTexParameteri 调用之后插入这个:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
于 2013-01-25T09:49:09.073 回答
1

纹理已正确加载,但未显示。使用glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);而不是glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 如果这还不够,请尝试glDepthMask(GL_FALSE);查看您是否至少具有 alpha 值。如果这还不够,请尝试

glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_NOTEQUAL, 0.0 );

在你的初始化函数中

于 2017-02-09T18:34:50.747 回答
0

透明像素是白色的,因为您指定的颜色是白色。根据格式GL_DECAL参考,RGBA此处应用的公式是Cp * (1- As) + Cs*As,现在当您的纹理完全透明时,您As将变为0最终颜色值等于Cp您的四边形(白色)的颜色。

我认为在这种情况下,您应该使用将四边形的 alpha 设置为零glColor4f(1.0f, 1.0f, 1.0f, 0.0f)

于 2013-01-25T20:05:28.660 回答