C++ OpenGL渲染闭合透明对象?

C++ OpenGL渲染闭合透明对象?,c++,opengl,glm-math,opengl-3,C++,Opengl,Glm Math,Opengl 3,我正在尝试在OpenGL中渲染透明对象。 因为透明对象需要从后向前绘制。 我为一个三角形创建了一个类,并将每个三角形存储在如下列表中:std::list*triangles该对中的浮点值是相机与三角形最小顶点之间的距离。最小顶点的计算如下: glm::vec3 CoreTriangle::getMinVertex(glm::vec3 cameraPosition) { int i = 0; float distance1 = glm::distance(cameraPositi

我正在尝试在OpenGL中渲染透明对象。 因为透明对象需要从后向前绘制。 我为一个三角形创建了一个类,并将每个三角形存储在如下列表中:
std::list*triangles
该对中的浮点值是相机与三角形最小顶点之间的距离。最小顶点的计算如下:

glm::vec3 CoreTriangle::getMinVertex(glm::vec3 cameraPosition) {
    int i = 0;

    float distance1 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[0], 1.0f)).xyz());
    float distance2 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[1], 1.0f)).xyz());
    float distance3 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[2], 1.0f)).xyz());

    if(distance1 < distance2 && distance1 < distance3) {
        i = 0;
    }
    else if(distance2 < distance1 && distance2 < distance3) {
        i = 1;
    }
    else if(distance3 < distance1 && distance3 < distance2) {
        i = 2;
    }

    return (modelMat * glm::vec4(vertices[i], 1.0f)).xyz();
}
我有几个三角形排成一行,看起来像这样:

glm::vec3 CoreTriangle::getMinVertex(glm::vec3 cameraPosition) {
    int i = 0;

    float distance1 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[0], 1.0f)).xyz());
    float distance2 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[1], 1.0f)).xyz());
    float distance3 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[2], 1.0f)).xyz());

    if(distance1 < distance2 && distance1 < distance3) {
        i = 0;
    }
    else if(distance2 < distance1 && distance2 < distance3) {
        i = 1;
    }
    else if(distance3 < distance1 && distance3 < distance2) {
        i = 2;
    }

    return (modelMat * glm::vec4(vertices[i], 1.0f)).xyz();
}

这将使所有接缝都适用于不相交的单个三角形

但后来我尝试渲染一个透明的立方体,它看起来像这样:

glm::vec3 CoreTriangle::getMinVertex(glm::vec3 cameraPosition) {
    int i = 0;

    float distance1 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[0], 1.0f)).xyz());
    float distance2 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[1], 1.0f)).xyz());
    float distance3 = glm::distance(cameraPosition, (modelMat * glm::vec4(vertices[2], 1.0f)).xyz());

    if(distance1 < distance2 && distance1 < distance3) {
        i = 0;
    }
    else if(distance2 < distance1 && distance2 < distance3) {
        i = 1;
    }
    else if(distance3 < distance1 && distance3 < distance2) {
        i = 2;
    }

    return (modelMat * glm::vec4(vertices[i], 1.0f)).xyz();
}


因此,在某些位置,三角形的渲染顺序不正确。如何修复此问题?

距离摄像机最近的角由多个三角形共享。它可能有助于按法向量对距离“相等”的三角形进行排序。但请注意,要“排序”2个三角形,必须计算三角形角的6条光线中是否有一条与另一个三角形相交。事件,则此测试仍有失败的情况。@Rabbid76按法向量排序是什么意思?你的意思是在排序中应该使用法线而不是顶点吗?不,不是。另外,如果距离相等。@rabbi76好的,你知道我的列表有什么方法可以做到这一点,而不必检查每个元素并检查它们是否相等吗?@rabbi76我正在尝试实现这一点,我应该只使用法线还是顶点+法线?离相机最近的角由多个三角形共享。它可能有助于按法向量对距离“相等”的三角形进行排序。但请注意,要“排序”2个三角形,必须计算三角形角的6条光线中是否有一条与另一个三角形相交。事件,则此测试仍有失败的情况。@Rabbid76按法向量排序是什么意思?你的意思是在排序中应该使用法线而不是顶点吗?不,不是。另外,如果距离相等。@rabbi76好的,你知道我的列表有什么方法可以做到这一点,而不必检查每个元素并检查它们是否相等吗?@rabbi76我正在尝试实现这一点,我应该只使用法线还是顶点+法线?