OpenGL混合问题

5
我想在桌子上画一个水族箱(容器)。水族箱的墙壁需要融合。但是,如果我先画桌子,然后再画水族箱,我会得到以下结果: - 从桌子上方看:没问题。 - 从桌子下方看:有问题,我仍然可以看到水族箱。
如果我先画水族箱,然后再画桌子,我会得到以下结果: - 从桌子上方看:有问题,水族箱的墙壁对桌子没有影响(尽管它们会影响背景)。 - 从桌子下方看:有问题,我仍然可以看到水族箱。
下面有一张图片来解释这个问题:http://img213.imageshack.us/img213/6609/pictureem.jpg 代码:main.cpp
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

 Cam.SetPrespective(); 

 //----------------
 GLfloat LightPosition0[]= { 0.0, 0.0, 0.2, 1.0f };
 GLfloat LightAmbient0[]= { 0, 0, 0, 1.0f };
 GLfloat LightDiffuse0[]= { 1.0f, 1.0f, 1.0f, 1.0f };
 GLfloat LightSpecular0[]= { 1.0f, 1.0f, 1.0f, 1.0f };
 glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient0);    // Setup The Ambient Light
 glLightfv(GL_LIGHT0, GL_POSITION,LightPosition0);   // Position The Light
 glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse0);    // Setup The Diffuse Light
 glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular0);    // Setup The Diffuse Light
 glEnable(GL_LIGHT0);
 glEnable(GL_COLOR_MATERIAL);
 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

 //----------------

 glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);    // Setup The Ambient Light
 glLightfv(GL_LIGHT2, GL_POSITION,LightPosition);   // Position The Light
 glLightfv(GL_LIGHT2, GL_DIFFUSE, LightDiffuse);    // Setup The Diffuse Light


 drawContainer(); //container drawn first in this example
 //.. draw other things
 drawTable();
drawGround();

/*
    //.. draw other things
    drawTable();
    drawGround();
    drawContainer(); //container drawn last in this example
*/
    CheckKeys();
 if(mouse) 
 {
 CheckMouse();
}

return TRUE;
}

void drawTable()
{
 glColor3f(1.0f, 0.5f, 1.0f);

 GLfloat cx = MIN_X+(MAX_X-MIN_X)/2.0f;
 GLfloat cy = MIN_Y-0.1f;
 GLfloat cz = MIN_Z+(MAX_Z-MIN_Z)/2.0f;
 GLfloat cr = sqrt((MAX_X-MIN_X)*(MAX_X-MIN_X)+(MAX_Z-MIN_Z)*(MAX_Z-MIN_Z))*0.85f;
 int th = 5.0f; //centerPieceThickness

 drawCylinder(cx,cy,cz,th,cr);
 glColor3f(0.7f, 0.5f, 0.5f);
 drawCylinder(MAX_X+cr*0.155f, cy-th, MAX_Z+cr*0.155f, 25*th, cr*0.035f); 
 drawCylinder(MAX_X+cr*0.155f, cy-th, MIN_Z-cr*0.155f, 25*th, cr*0.035f);
 drawCylinder(MIN_X-cr*0.155f, cy-th, MIN_Z-cr*0.155f, 25*th, cr*0.035f);
 drawCylinder(MIN_X-cr*0.155f, cy-th, MAX_Z+cr*0.155f, 25*th, cr*0.035f);
}

void drawGround()
{ 
 int th = 5.0f;
 GLfloat cx = MIN_X+(MAX_X-MIN_X)/2.0f;
 GLfloat cy = MIN_Y-0.1f;
 GLfloat cz = MIN_Z+(MAX_Z-MIN_Z)/2.0f;
 GLfloat cr = sqrt((MAX_X-MIN_X)*(MAX_X-MIN_X)+(MAX_Z-MIN_Z)*(MAX_Z-MIN_Z))*8.5f;
 glColor3f(0.0f, 0.6f, 0.0f);
 drawCylinder(cx,cy-26*th,cz,10.f,cr);
}

void drawContainer()
{
    glColor3f(0.2f, 0.2f, 0.2f);
 drawCuboid(MIN_X-0.5, MAX_X+0.5f, MIN_Y-0.5, MIN_Y+0.5, MIN_Z-0.5f, MIN_Z+0.5f);
 drawCuboid(MIN_X-0.5, MAX_X+0.5f, MIN_Y-0.5, MIN_Y+0.5, MAX_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MIN_X-0.5, MAX_X+0.5f, MAX_Y-0.5, MAX_Y+0.5, MIN_Z-0.5f, MIN_Z+0.5f);
 drawCuboid(MIN_X-0.5, MAX_X+0.5f, MAX_Y-0.5, MAX_Y+0.5, MAX_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MIN_X-0.5, MIN_X+0.5f, MIN_Y-0.5, MAX_Y+0.5, MIN_Z-0.5f, MIN_Z+0.5f);
 drawCuboid(MIN_X-0.5, MIN_X+0.5f, MIN_Y-0.5, MAX_Y+0.5, MAX_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MAX_X-0.5, MAX_X+0.5f, MIN_Y-0.5, MAX_Y+0.5, MIN_Z-0.5f, MIN_Z+0.5f);
 drawCuboid(MAX_X-0.5, MAX_X+0.5f, MIN_Y-0.5, MAX_Y+0.5, MAX_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MIN_X-0.5, MIN_X+0.5f, MIN_Y-0.5, MIN_Y+0.5, MIN_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MIN_X-0.5, MIN_X+0.5f, MAX_Y-0.5, MAX_Y+0.5, MIN_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MAX_X-0.5, MAX_X+0.5f, MIN_Y-0.5, MIN_Y+0.5, MIN_Z-0.5f, MAX_Z+0.5f);
 drawCuboid(MAX_X-0.5, MAX_X+0.5f, MAX_Y-0.5, MAX_Y+0.5, MIN_Z-0.5f, MAX_Z+0.5f);

 glEnable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);
 glColor4f(0.5f,1.0f,1.0f,0.12f);

 drawCuboid(MIN_X,MAX_X,MIN_Y,MAX_Y,MIN_Z,MAX_Z);

 glDisable(GL_BLEND);
 glEnable(GL_DEPTH_TEST);


}

请更好地缩进您的代码。 - karlphillip
2个回答

5
对于不透明的多边形: 启用GL_DEPTH_TEST,并渲染所有这些。
对于透明的多边形:保持GL_DEPTH_TEST,但使用glDepthMask(GL_FALSE)禁用深度写入,并在渲染之前从后向前排序透明多边形。
另请参阅FAQ

4

我怀疑问题是由drawContainer()函数中的glDisable(GL_DEPTH_TEST)引起的。我建议注释掉GL_DEPTH_TEST这些代码行,这样水族箱在桌子和地板方面是否正确显示?


是的,这样可以:)。但只有在水族馆最后绘制时才行。我当时就怀疑这可能是解决方法,但那时水族馆被首先绘制了... - Ichibann
你仍然需要对透明的多边形进行排序。请看下面我的回答。 - Justicle
我不知道为什么我应该这样做。现在从水族馆的任何一侧看,它看起来都像我想要的样子。 - Ichibann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接