在OpenGl中正确绘制alpha通道

时间:2010-06-23 21:19:15

标签: c++ opengl alpha

加载图像后,我将每个通道的单个字节加载到无符号字符数组中。它被传递给一个函数,将它作为纹理投影到四边形上。除了alpha通道之外,一切似乎都能正常工作,alpha通道显示为背景颜色。我正在使用OpenGL绘制图像。我会通过添加分层机制获益吗?另外,我怎样才能达到我想要的透明效果呢?

注意:这是我需要改变的代码:

void SetUpView()
{
    // Set color and depth clear value
    glClearDepth(1.f);
    glClearColor(1.f, 0.f, 0.f, 0.f);

    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glDepthMask(GL_TRUE);

    glEnable (GL_BLEND); 
    glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
};

此外,这是渲染四边形的代码。

void DrawTexturedRect(RectBounds *Verts, Image *Texture)
{
    glBindTexture(GL_TEXTURE_2D, GetTextureID(Texture));

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelZoom(1, -1);

    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 1.0);
    glVertex3f(Verts->corners[0].x, Verts->corners[0].y, Verts->corners[0].z);

    glTexCoord2f(1.0, 1.0);
    glVertex3f(Verts->corners[1].x, Verts->corners[1].y, Verts->corners[1].z);

    glTexCoord2f(1.0, 0.0);
    glVertex3f(Verts->corners[2].x, Verts->corners[2].y, Verts->corners[2].z);

    glTexCoord2f(0.0, 0.0);
    glVertex3f(Verts->corners[3].x, Verts->corners[3].y, Verts->corners[3].z);
    glEnd();
};

Image类包含一个使用OpenIL获得的无符号字符数组。

相关代码:

loaded = ilLoadImage(filename.c_str());
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);

unsigned char *bytes = ilGetData();

//NewImage is an instance of an Image. This is returned and passed to the above function.
NewImage->data = bytes;

Problem http://img375.imageshack.us/img375/9585/j120192.png

由于

3 个答案:

答案 0 :(得分:2)

在绘制透明图之前,您应该致电:

glDepthMask(false);

之后:

glDepthMask(true);

此外,必须在所有透明对象之后绘制所有透明对象。

答案 1 :(得分:0)

glClearColor(1.f,0.f,0.f,0.f);

我假设它是RGBA默认值,你将红色设置为1.0。

如何更好地解释你想要完成的事情?

答案 2 :(得分:0)

尝试:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

编辑:我知道那是什么样的。看起来你正在绘制蓝色方块(在光标后面有一个Z顺序位置放在光标后面)。在alpha混合时你必须用正确的,从前到后的Z-Order绘制东西,否则你会看到像你看到的错误。