2011-01-12 104 views
1

我试图显示“透明”表面(不封闭卷)与正面和背面都可见(不扑捉)。OpenGL alpha混合问题与背面可见

例如,显示在两侧应用透明度的圆锥体或圆柱体。 有一些可见的工件,其中一部分表面似乎不正确地处理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

tinyurled链接到2张图片的flickr表示问题(但是从生产出来的代码,而不是上面的代码,但两者具有相同的类型的问题): http://flic.kr/p/99soxyhttp://flic.kr/p/99pg18

谢谢。 最大。

回答

5

您的问题可能是两个问题的混合。

  • 为您深度测试开启,并且所有多边形写深度缓冲区,如果他们最近的多边形后得出较远的多边形不能有助于像素的颜色。您应该尝试禁用深度测试。

  • alphablending是一个非交换操作,所以三角形绘制的顺序很重要,并且会改变结果。要获得一致的结果,您必须按照一致的顺序绘制三角形。在你的代码中,这个顺序可能会有所不同,具体取决于视点。由于您的物体是凸面的,因此您可以在两次通过时绘制物体,这两个通道都启用了剔除功能,第一次绘制背面三角形(距离相机最远),然后是面向前方的三角形(最近)

更一般地说,任意几何图形的正确混合是一个难题,如果你想进一步研究,你可能想看看Order Independent Transparency算法(深度剥离,...)。

+0

谢谢。似乎是在我们的软件上这么做的漫长过程。 – Max 2011-03-16 12:51:08