首先,需要为体素创建/加载数据。类似以下内容可用于生成10x10x10的二进制体素场:
注意:所有代码都未经测试,可能不是最优的。
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);
}
}
}
我假设你是在寻找Minecraft风格的体素,否则你可能想使用类似Marching Cubes的东西来处理二进制体素场,并将结果传递给顶点缓冲区代码。
下一步是为字段中的每个已占用体素绘制与立方体关联的面。为此,我们需要创建所有顶点和(在本例中)三角形索引的列表。
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来存储顶点数据,而不仅仅是数组。
现在,我们可以将阵列传递给OpenGL:
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);
最后,要绘制我们的阵列:
glBindVertexArray(unVertexArray);
glDrawElements(GL_TRIANGLES, 3*vecTris.size(), GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);
我可能(几乎可以肯定)在这里忘记了一些事情,但这应该会给你一个你需要做什么的大致轮廓。为了正确解释上面使用的大多数gl
调用,有许多在线引用,例如http://arcsynthesis.org/gltut/index.html
我目前正在构建一个体素引擎(比如Minecraft),我正在使用opengl。 发动机的当前设计如下所示: 班级地图- 类块- 类块- 我想做的是让每个块都有一个Draw()函数,它将绘制块中的所有块。我想我应该使用glGenBuffers()为每个块创建一个缓冲区。从我读的教程应该首先创建一个顶点数组与glVertex Array和比绑定它,比绑定一个缓冲区,它与目标GL_ARRAY_BUFFE
所以我一直在思考一个问题。我目前正在用Java编写一个基于比特板的国际象棋引擎(这是一个解决所有问题的过程)。到目前为止,所有的棋子/国王/骑士的动作都按预期进行,而且没有bug。 我需要帮助理解的是滑动件移动生成。我已经为每个方块/棋子生成了一系列空棋盘动作。根据我目前的理解,我还需要开发一个数组,包含每个广场上的每个可能占用空间——然后根据各种方法查找该数组。 这种想法正确吗?这是不是一个从0
我想做一个OpenGL游戏,但现在意识到我在学校学到的- 1)我应该使用OpenGL的glDrawArray还是glDrawElements? 2) 对于具有多个实体/场地/对象的游戏,渲染函数必须是多个glDrawArrays(): 或者只有一个glDrawArrays()封装每个实体: 3)每个图形层(如DirectX)现在都标准化顶点缓冲区对象吗?
我正在尝试制作一个类似于minecraft的opengl体素引擎。 我创建了一个块类,我想把整个块的所有顶点放在一个VBO中。我以前只把每个块放入vbo,并调用渲染每个块。 当我将所有顶点放入一个vbo中时,我对如何转换块中每个块的坐标感到有点困惑。 这是我目前所拥有的: 有什么简单的方法可以将每个块的顶点转换到正确的位置?我以前在每次调用渲染块时都使用glTranslatef,但现在不行了。我现
通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。 比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的
我正在用OpenGL(PyOpenGL和Python)显示几何图形(文件格式:.stl)。几何数据具有形式,由三角形组合而成。 我保存到 VBO 数据;顶点、法线和颜色。由于法线仅每 3 个顶点(三角形)定义,并且我为每个顶点定义颜色矢量,因此 VBO 中的数据具有以下形式: 大写:;首先我保存所有顶点,然后我“附加”(使用)所有法线(法线数比顶点数和顶点颜色少3倍),然后我附加每个顶点的颜色向量