我正在尝试显示“透明”表面(非封闭体积),正面和背面均可见(未剔除)。
例如,显示两侧都应用透明度的圆锥或圆柱体。 有一些可见的瑕疵,表面的某些部分似乎没有正确处理alpha值。
似乎问题是当我(opengl)试图将alpha从表面的正面应用到表面的背面时。 (当表面的内部/外部都可见时)。
void init()
{
glMatrixMode(GL_PROJECTION);
gluPerspective( /* field of view in degree */ 40.0,
/* aspect ratio */ 1.0,
/* Z near */ 1.0, /* Z far */ 10.0);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */
0.0, 0.0, 0.0, /* center is at (0,0,0) */
0.0, 1.0, 0.); /* up is in positive Y direction */
glTranslatef(0.0, 0.6, -1.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);
glLightfv(GL_LIGHT2, GL_POSITION, light2_position);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
glFrontFace( GL_CW );
glShadeModel(GL_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void draw ()
{
static GLfloat amb[] = {0.4f, 0.4f, 0.4f, 0.0f};
static GLfloat dif[] = {1.0f, 1.0f, 1.0f, 0.0f};
static GLfloat back_amb[] = {0.4f, 0.4f, 0.4f, 1.0f};
static GLfloat back_dif[] = {1.0f, 1.0f, 1.0f, 1.0f};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_LIGHT1);
glDisable(GL_LIGHT2);
amb[3] = dif[3] = 0.5f;// cos(s) / 2.0f + 0.5f;
glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
glMaterialfv(GL_BACK, GL_AMBIENT, back_amb);
glMaterialfv(GL_BACK, GL_DIFFUSE, back_dif);
glPushMatrix();
glTranslatef(-0.3f, -0.3f, 0.0f);
glRotatef(angle1, 1.0f, 5.0f, 0.0f);
glutSolidCone(1.0, 1.0, 50, 2 );
glPopMatrix();
///...
SwapBuffers(wglGetCurrentDC()); // glutSwapBuffers();
}
代码基于:http://www.sgi.com/products/software/opengl/examples/glut/examples/source/blender.c
flickr上2个图像的微小链接显示问题(但是从生产代码中,不是上面的代码,但两者都有同样的问题): http://flic.kr/p/99soxy和http://flic.kr/p/99pg18
感谢。 最大
答案 0 :(得分:5)
你的问题可能是两个问题的混合。
启用深度测试,并且所有多边形都写入深度缓冲区,如果在最近的多边形之后绘制,则距离较远的多边形无法提供像素颜色。您应该尝试禁用深度测试。
alphablending是一种非交换操作,因此绘制三角形的顺序很重要并且会改变结果。要获得一致的结果,您必须以一致的顺序绘制三角形。在您的代码中,此顺序可能会有所不同,具体取决于视点。由于你的对象是凸面的,你可以在两次通过中绘制你的对象,同时启用剔除,第一次绘制背面三角形(距离相机最远),然后是前面三角形(最近的)
更一般地说,正确混合任意几何图形是一个难题,如果您想进一步了解,可能需要查看顺序无关透明度算法(深度剥离......)。