繁体   English   中英

如何使用 GL_TRIANGLE_STRIP 绘制矩形框?

[英]How do I draw a rectangular box using GL_TRIANGLE_STRIP?

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

在此处输入图像描述

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

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

三角形条形立方体的公式完成了大部分工作,您所要做的就是扩展长面以在其间添加更多,这可以通过 for 循环来完成。 长脸立方体 条带有两次改变方向,都在底面上,所以我们只需要在那里做一些手工工作。 我写了这个简单的 function 来创建基于长度的顶点,它将构建一个长度为 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 足够聪明,知道绕组顺序每隔一个三角形就会颠倒一次,所以不需要做任何花哨的数学运算。 你只需要确保它适合第一个,在这种情况下,第一个是逆时针的。

结果

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM