簡體   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