OpenGL透明混合问题,背面可见

3
我正在尝试显示“透明”的表面(不是封闭的体积),使得正反两面都可见(不被剔除)。
例如,显示一个圆锥或圆柱,其中透明度应用在两侧。但是,有一些可见的伪影,其中某些部分的表面似乎未正确处理 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链接到两张在flickr上显示问题的图片(但是来自我们的生产代码,而不是上述代码,但两者都有同样的问题):http://flic.kr/p/99soxyhttp://flic.kr/p/99pg18 谢谢。 Max.
1个回答

6
您的问题可能是两个问题的混合。
  • 由于启用了深度测试,并且所有多边形都写入深度缓冲区,如果更远的多边形在最近的多边形之后绘制,则更远的多边形无法对像素颜色做出贡献。您应该尝试禁用深度测试。
  • Alpha混合是一种非交换操作,因此绘制三角形的顺序很重要并且会改变结果。为了获得一致的结果,您必须以一致的顺序绘制三角形。在您的代码中,这个顺序可能会有所不同,具体取决于视点等因素。由于您的对象是凸面的,您可以使用两个通过启用裁剪来绘制对象的过程。第一个过程绘制背面三角形(最远离相机的三角形),然后绘制前面的三角形(最近的三角形)。
总的来说,对于任意几何图形的正确混合是一个难题,如果您想进一步了解,可以查看无序透明度算法(如深度剥离等)。

谢谢。在我们的软件上似乎需要一个漫长的过程来完成这个任务。 - Max
@Max,不用谢,实现“真正”的透明度可能需要一些工作。根据您的需求和使用环境,实现一些好看的透明度可能会更容易。请毫不犹豫地利用/滥用您的模型/环境/渲染风格等特定要素。 - rotoglup

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