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

C++ 具有不透明度的面的双面混合,c++,qt,opengl,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

我画了两个透明度为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();
}
static const GLfloat P1[3]={0.0,-1.0,+2.0};
静态常量GLfloat P2[3]={+1.73205081,-1.0,-1.0};
静态常数GLfloat P3[3]={-1.73205081,-1.0,-1.0};
静态常数GLfloat P4[3]={0.0,+2.0,0.0};
静态常量GLfloat*常量坐标[4][3]={
{P1,P2,P3},{P1,P3,P4},{P1,P4,P2},{P2,P4,P3}
};
glMatrixMode(GLU模型视图);
glLoadIdentity();
glTranslatef(0.0,0.0,-10.0);
glScalef(缩放、缩放、缩放);
glRotatef(rotationX,1.0,0.0,0.0);
glRotatef(rotationY,0.0,1.0,0.0);
glRotatef(rotationZ,0.0,0.0,1.0);
对于(int i=0;i<2;++i){
姓名(i);
glBegin(GL_多边形);
QColor color=faceColors[i];
颜色:setAlpha(50);
qglColor(彩色);
对于(int j=0;j<3;++j){
glVertex3f(coords[i][j][0],coords[i][j][1],
协调[i][j][2];
}
格伦德();
}
我的意思是画和探索像这样的场景

(来源:)

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

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

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

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

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

我发现,如果我以另一个顺序绘制多边形,问题会反过来。这对我来说可能与背面剔除有关。尝试在开始时调用此命令:
glDisable(GL\u CULL\u FACE)
@Brett culling已禁用。这不是不可原谅的原因。我认为这个问题是由一些我不知道的混合特性引起的。
glEnable(GL\u DEPTH\u TEST)这可能是导致您出现问题的原因。混合和深度测试彼此不协调,需要在两个过程中进行渲染。首先使用深度测试渲染所有实心几何体,在第二步中,保留深度测试,但禁用depthbuffer写入并使用Blending渲染。这仅适用于非常简单的情况,即只有一层透明几何体。否则,您必须将透明几何体从前向后排序,并按该顺序绘制。如果有重叠的透明对象,则必须将其拆分,以便从后向前绘制。@RetoKoradi这个答案不是混合的通用方法,只是一个简单的两遍渲染示例。这似乎足以满足老年退休金计划的需要