首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBO为块生成Verts (Voxel Engine,Cpp)

VBO为块生成Verts (Voxel Engine,Cpp)
EN

Stack Overflow用户
提问于 2014-05-02 11:38:31
回答 1查看 678关注 0票数 0

我在研究Voxel引擎,我用的是VBO。我的问题是我不知道如何生成顶点。

我需要为一个块生成顶点,所以从X,Y,Z同弦创建一个立方体块(用一个VBO)。

我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-15 18:11:17

首先,需要为体素创建/加载数据。可以使用以下内容生成二进制体素的10x10x10字段:

注意:所有的代码都是未经测试的,而且可能不是最优的。

代码语言:javascript
复制
class Field {
    bool data[10*10*10];
public:
    bool& at(int i, int j, int k) { return data[i*10*10 + j*10 + k]; }
};


Field aField;
for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < 10; ++j) {
        for (int k = 0; k < 10; ++k) {
            aField.at(i, j, k) = !(rand() % 2);
        }
    }
}

我假设您是在“我的世界”风格的体素之后,否则您可能希望使用像行进立方体这样的方法来处理二进制体素字段,并将结果传递给顶点缓冲区代码。

下一步是为字段中的每个占用的体素绘制与立方体相关的面。为此,我们需要创建一个包含所有顶点和(在本例中)三角形索引的列表。

代码语言:javascript
复制
std::vector< std::array<GLfloat, 3> > vecVerts;
std::vector< std::array<GLuint, 3> > vecTris;
for (int i,j,k from 0 to 10) {
    if (aField.at(i,j,k)) {
        // Add vertices for eight corners of cube
        vecVerts.emplace_back(dWidth*(i  ), dWidth*(j  ), dWidth*(k  ));
        vecVerts.emplace_back(dWidth*(i+1), dWidth*(j  ), dWidth*(k  ));
        vecVerts.emplace_back(dWidth*(i  ), dWidth*(j+1), dWidth*(k  ));
        vecVerts.emplace_back(dWidth*(i+1), dWidth*(j+1), dWidth*(k  ));
        vecVerts.emplace_back(dWidth*(i  ), dWidth*(j  ), dWidth*(k+1));
        vecVerts.emplace_back(dWidth*(i+1), dWidth*(j  ), dWidth*(k+1));
        vecVerts.emplace_back(dWidth*(i  ), dWidth*(j+1), dWidth*(k+1));
        vecVerts.emplace_back(dWidth*(i+1), dWidth*(j+1), dWidth*(k+1));

        // Add triangle coordinates for each triangle
        vecTris.emplace_back(0, 1, 3); vecTris.emplace_back(0, 2, 3);
        vecTris.emplace_back(4, 5, 7); vecTris.emplace_back(4, 6, 7);
        /* todo: add remaining triangles, should be 8 more */
    }
}

上面的代码将在内存中创建两个数组,存储顶点位置和三角形索引。您会注意到,代码总是为每个体素绘制12个三角形,最好检查是否有相邻的占用体素,并删除这些体素之间的脸,但我会留给您。我还建议您考虑使用glm::vec3 3来存储顶点数据,而不是仅仅存储一个数组。

现在我们可以将数组传递给OpenGL:

代码语言:javascript
复制
GLuint unVertexArray;
glGenVertexArrays(1, &unVertexArray);
glBindVertexArray(unVertexArray);

GLuint unVertexBuffer;
glGenBuffers(1, &unVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, unVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, 3*vecVerts.size()*sizeof(GLfloat),
    &vecVerts[0][0], GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

GLuint unIndiciesBuffer;
glGenBuffers(1, &unIndicesBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, unIndicesBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*vecTris.size()*sizeof(GLuint),
    &vecTris[0][0], GL_STATIC_DRAW);

glBindVertexArray(0);

最后,绘制我们的数组:

代码语言:javascript
复制
glBindVertexArray(unVertexArray);
glDrawElements(GL_TRIANGLES, 3*vecTris.size(), GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);

我可能(我几乎肯定)在这里忘记了一些事情,但这应该给你一个大致的大纲,你将需要做什么。为了正确解释上面使用的大多数gl调用,有许多在线引用,比如http://arcsynthesis.org/gltut/index.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23427243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档