简体   繁体   English

如何使用GL_TRIANGLES生成平面?

[英]How to generate a plane using GL_TRIANGLES?

Is there an algorithm that could be used to generate a plane using the GL_TRIANGLES primitive type? 是否存在可以使用GL_TRIANGLES基本类型生成平面的算法?

Here's my current function: 这是我当前的功能:

Mesh* Mesh::CreateMeshPlane(vec2 bottomleft, ivec2 numvertices, vec2 worldsize){

int numVerts = numvertices.x * numvertices.y;

float xStep = worldsize.x / (numvertices.x - 1);
float yStep = worldsize.y / (numvertices.y - 1);

VertexFormat* verts = new VertexFormat[numVerts];

for (int y = 0; y < numvertices.y; y++)
{
    for (int x = 0; x < numvertices.x; x++)
    {           
        verts[x + (y * numvertices.x)].pos.x = bottomleft.x + (xStep * x);
        verts[x + (y * numvertices.x)].pos.y = bottomleft.y + (yStep * y);
        verts[x + (y * numvertices.x)].pos.z = 0;
    }
}

Mesh* pMesh = new Mesh();
pMesh->Init(verts, numVerts, indices, 6, GL_STATIC_DRAW);

glPointSize(10.0f);
pMesh->m_PrimitiveType = GL_POINTS;

delete[] verts;

return pMesh;}

I'm just unsure how to implement indices into the for loop to be able to know which points to draw. 我只是不确定如何在for循环中实现索引,以便知道要绘制的点。

What I think I need to know: 我想我需要知道的是:

Each square will be made up of 2 triangles, each square requiring 6 indices 每个正方形将由2个三角形组成,每个正方形需要6个索引

Currently I'm drawing from the bottom left 目前,我正在从左下方绘制

I need to know how many squares I'll have from the numbers passed in 我需要从传入的数字中知道多少个正方形

Maybe something like this: 也许是这样的:

int width = 4;
int length = 6;
int height = 1;

std::vector<float> planeVertices;

for (int x = 0; x < width - 1; x++) {
    for (int z = 0; z < length - 1; z++) {
        planeVertices.push_back(x);
        planeVertices.push_back(height);
        planeVertices.push_back(z);

        planeVertices.push_back(x);
        planeVertices.push_back(height);
        planeVertices.push_back(z + 1);

        planeVertices.push_back(x + 1);
        planeVertices.push_back(height);
        planeVertices.push_back(z + 1);


        planeVertices.push_back(x);
        planeVertices.push_back(height);
        planeVertices.push_back(z);

        planeVertices.push_back(x + 1);
        planeVertices.push_back(height);
        planeVertices.push_back(z);

        planeVertices.push_back(x + 1);
        planeVertices.push_back(height);
        planeVertices.push_back(z + 1);
    }
}

...

unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, planeVertices.size() * sizeof(float), planeVertices.data(), GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
glEnableVertexAttribArray(0);

...

glDrawArrays(GL_TRIANGLES, 0, (width - 1) * (length - 1) * 6);

This code creates an std::vector<float> and adds the plane vertices to it. 此代码创建一个std::vector<float> ,并将平面顶点添加到其中。 The nested for loops add two triangles for every unit of the plane (so with width as 4 and length as 6 the plane will be 4 units by 6 units, and will be made of 6 * 4 * 2 = 48 triangles). 嵌套的for循环为平面的每个单元添加两个三角形(因此, width为4, length为6时,该平面将为4个单元乘6个单元,并由6 * 4 * 2 = 48个三角形组成)。 The height of the plane is set by the height variable. 平面的heightheight变量设置。 This only generates flat planes, but a simple transformation lets you rotate and scale this as you need. 这只会生成平面,但是通过简单的转换,您就可以根据需要旋转和缩放比例。

WARNING: this code is untested. 警告:此代码未经测试。

Just to close this question here's how I did it: 为了结束这个问题,这是我的做法:

Mesh* Mesh::CreateMeshPlane(vec3 bottomleft, ivec2 numvertices, vec2 
worldsize, vec2 texturerepetition)
{
    int numVerts = numvertices.x * numvertices.y;
    int numFaces = (numvertices.x - 1) * (numvertices.y - 1);
    int numIndices = numFaces * 6;

    float xStep = worldsize.x / (numvertices.x - 1);
    float yStep = worldsize.y / (numvertices.y - 1);
    float zStep = worldsize.y / (numvertices.y - 1);

    float uStep = texturerepetition.x / (numvertices.x - 1);
    float vStep = texturerepetition.y / (numvertices.y - 1);

    VertexFormat* verts = new VertexFormat[numVerts];
    unsigned int* indices = new unsigned int[numIndices];

    for (int y = 0; y < numvertices.y; y++)
    {
        for (int x = 0; x < numvertices.x; x++)
        {
            verts[x + (y * numvertices.x)].pos.x = bottomleft.x + (xStep * x);
            verts[x + (y * numvertices.x)].pos.y = bottomleft.y;
            verts[x + (y * numvertices.x)].pos.z = bottomleft.z + (zStep * y);

            verts[y * numvertices.x + x].uv.x = uStep * x;
            verts[y * numvertices.x + x].uv.y = vStep * y;
        }
    }

    int offset = 0;

    for (int i = 0; i < numIndices; i++)
    {
        // The bottom left index of the current face
        // + the offset to snap back when we hit the edge
        unsigned int cornerIndex = i/6 + offset;

        // If we reach the edge we increase the offset so that it goes to the next bottom left
        if ((cornerIndex + 1)%numvertices.x == 0)
        {
            offset++;
            cornerIndex++; // Adding new offset to the bottom left
        }

        // First triangle
        indices[i] = (unsigned int)cornerIndex;
        i++;
        indices[i] = (unsigned int)cornerIndex + numvertices.x;
        i++;
        indices[i] = (unsigned int)cornerIndex + numvertices.x + 1;
        i++;

        // Second triangle
        indices[i] = (unsigned int)cornerIndex;
        i++;
        indices[i] = (unsigned int)cornerIndex + numvertices.x + 1;
        i++;
        indices[i] = (unsigned int)cornerIndex + 1;
    }

    //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    Mesh* pMesh = new Mesh();
    pMesh->Init(verts, numVerts, indices, numIndices, GL_STATIC_DRAW);

    delete[] verts;

    return pMesh;
}

Workflow: 1. Calculating number of faces I need, then the number of indices 2. Creating an offset that is added to the cornerIndex when we realize we hit the edge of the vertex array (by using modulus numvertices.y) 3. Doing simple math to draw corners in correct order based on the cornerIndex 工作流程:1.计算我需要的面数,然后计算索引数2.当我们意识到碰到顶点阵列的边缘时(通过使用模数numvertices.y),创建一个添加到cornerIndex的偏移量3.做简单数学以正确的顺序基于cornerIndex绘制角

Notes: 1. Im drawing using GL_TRIANGLES as the primitive type 2. Drawing from bottom left to top right 3. cornerIndex therefore is the bottom left of the current square we're drawing on 注意:1.使用GL_TRIANGLES作为基本类型的即时贴图绘制。2.从左下到右上绘制3.因此cornerIndex是我们要绘制的当前正方形的左下角

Hope someone can find this helpful! 希望有人能对您有所帮助!

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

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