如何使用 GL_TRIANGLE_STRIP 绘制矩形框?

How do I draw a rectangular box using GL_TRIANGLE_STRIP?

我是 OpenGL 编程的新手,需要一些帮助来解决这个问题。我发现这个 详细说明了如何使用 GL_TRIANGLE_STRIP 创建立方体网格。但是,我想创建一个矩形框,其中的一个轴不仅被拉长而且被重复,因此几何图形最终如下所示:

我无法弄清楚我应该如何构建这样一个形状,其中正确生成几何图形,具有正确的法线和闭合端,并牢记缠绕顺序等等。

我应该如何思考和定义顶点?

三角形条形立方体的公式完成了大部分工作,您所要做的就是延长长面以在其间添加更多,这可以通过 for 循环完成。 条带有两次改变方向,都在底面上,所以我们只需要在那里做一些手工工作。我编写了这个简单的函数来根据长度创建顶点,它将构建一个长度为 1 x 1 的矩形。

void generateRect(int length, std::vector<glm::vec3>& vertices) {
    std::vector<glm::vec3> vertexArray;
    
    //Generate nescessary points
    float x = length / 2.0f;
    for (int i = 0; i <= length; i++) {
        vertexArray.push_back(glm::vec3(x, -0.5f, 0.5f));
        vertexArray.push_back(glm::vec3(x, -0.5f, -0.5f));
        vertexArray.push_back(glm::vec3(x, 0.5f, 0.5f));
        vertexArray.push_back(glm::vec3(x, 0.5f, -0.5f));
        x -= 1.0f;
    }
    
    //+Y face
    for (int i = 0; i <= length; i++) {
        int index = i * 4 + 3;
        vertices.push_back(vertexArray.at(index));
        vertices.push_back(vertexArray.at(index - 1));
    }
    
    //Change direction (Half of -X face)
    vertices.push_back(vertexArray.at(length * 4));
    
    //+Z face
    for (int i = length - 1; i >= 0; i--) {
        int index = i * 4;
        vertices.push_back(vertexArray.at(index + 2));
        vertices.push_back(vertexArray.at(index));
    }
    
    //-Z face (+X face created as well)
    for (int i = 0; i <= length; i++) {
        int index = i * 4 + 3;
        vertices.push_back(vertexArray.at(index));
        vertices.push_back(vertexArray.at(index - 2));
    }
    
    //Change direction (Other half of -X face)
    vertices.push_back(vertexArray.at(length * 4));
    
    //-Y face
    for (int i = length - 1; i >= 0; i--) {
        int index = i * 4;
        vertices.push_back(vertexArray.at(index + 1));
        vertices.push_back(vertexArray.at(index));
    }
}

从这里我们得到了我们的矩形,对于纹理我只使用了一个立方体贴图,因为我一直在做天空盒。 OpenGL 足够聪明,知道缠绕顺序每隔一个三角形就会反转,所以不需要做任何花哨的数学运算。你只需要确保第一个是正确的,在这种情况下第一个是逆时针的。

对于法线生成,它有点难,因为顶点也必须共享法线,即使它被用于不同的面。我不认为有解决方法,但我没有对三角形带做太多,所以可能有,也许与几何着色器有关。