2010-06-23 76 views
3

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

注:这是我有一种感觉,需要改变的代码:

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

由于

+1

没有足够的数据。您没有显示纹理加载例程,也没有显示实际的渲染例程。 – SigTerm 2010-06-23 21:45:05

+0

好的,我试着清理渲染循环中发生的事情。 – Jeff 2010-06-23 22:07:54

+0

另外,你如何设置OpenGL?你确定你一直在请求alpha通道吗(例如,如果使用过剩,则使用像素格式,如果使用glut,则使用GLUT_RGBA)? – sbk 2010-06-23 22:47:46

回答

0

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

我假设这是在RGBA默认情况下,你将红色设置为1.0。

如何更好地解释你想要完成什么?

+1

看光标周围的红色框?在Paint.Net中,没有任何东西。它应该是alpha通道。 – Jeff 2010-06-23 21:35:56

0

尝试:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

编辑:我知道那是什么样子。看起来您正在绘制蓝色方块(其具有将光标放在光标后面的Z顺序位置)。您必须在Alpha混合时以正确的,背对背的Z顺序绘制事物,否则您会看到像您所看到的错误。

+0

谢谢,但我仍然得到相同的效果。应该调用一次还是每一帧? – Jeff 2010-06-23 21:37:29

2

之前绘制任何透明的,你应该叫:

glDepthMask(false); 

然后算账:

glDepthMask(true); 

而且,全透明的对象必须全部不透明的人憔悴。

+0

我有同样的问题,这解决了我的问题。 – Balk 2013-10-06 23:27:04

相关问题