具有不透明度的面的双面混合

时间:2014-10-26 07:51:54

标签: c++ qt opengl

我绘制了两个透明度为50%的多边形,但它只在一侧工作(看图像)。

Goood混合:

但从另一个角度来看:

蓝色管是0%透明度的轴。

这是初始化代码:

qglClearColor(QColor::fromCmykF(0.39, 0.39, 0.0, 0.0));

glEnable(GL_DEPTH_TEST);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

绘图:

static const GLfloat P1[3] = { 0.0, -1.0, +2.0 };
static const GLfloat P2[3] = { +1.73205081, -1.0, -1.0 };
static const GLfloat P3[3] = { -1.73205081, -1.0, -1.0 };
static const GLfloat P4[3] = { 0.0, +2.0, 0.0 };

static const GLfloat * const coords[4][3] = {
        { P1, P2, P3 }, { P1, P3, P4 }, { P1, P4, P2 }, { P2, P4, P3 }
};

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -10.0);

glScalef(scaling, scaling, scaling);

glRotatef(rotationX, 1.0, 0.0, 0.0);
glRotatef(rotationY, 0.0, 1.0, 0.0);
glRotatef(rotationZ, 0.0, 0.0, 1.0);

for (int i = 0; i < 2; ++i) {
    glLoadName(i);
    glBegin(GL_POLYGON);
    QColor color = faceColors[i];
    color.setAlpha(50);
    qglColor(color);
    for (int j = 0; j < 3; ++j) {
        glVertex3f(coords[i][j][0], coords[i][j][1],
            coords[i][j][2]);
    }
    glEnd();
}

我的观点是绘制和探索这样的场景 http://www.wblut.com/blog/wp-content/2009/04/voronoi3db2.jpg

1 个答案:

答案 0 :(得分:1)

问题在于使用混合和深度测试进行渲染。当通过深度测试发现几何体的一部分位于场景中的几何体的另一部分后面时,它被丢弃而不是混合。

要解决此问题,请分两步进行渲染

glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
// Render solid geometry here

glEnable(GL_BLEND);
glDepthMask(GL_FALSE);
// Render transparent geometry here

在第一步中,绘制实体几何图形而不进行混合。在第二遍中绘制透明几何体而不更改深度缓冲区。仍然可以进行深度测试,以避免在透明部分前面混合实体几何体。