我们已经渲染了第一个三角形,但如果我们想做一些更复杂的事情呢?例如,一个矩形?
OpenGL只在三角形中工作。它部分支持正方形和其他形状,但这些形状已被弃用很长时间,不应使用。你可以通过定义六个顶点来制作两个看起来像一个形状的三角形来做到这一点,但这是一种浪费,因为一个矩形只需要四个顶点。虽然这看起来并不可怕,但考虑一个立方体:如果没有浪费,只有八个顶点,但如果你使用用两个三角形制作每个面的方法,那么仅一个立方体就需要 36 个顶点!模型越复杂,数字只会变得更糟;显然,需要一种更好的方法。
有许多不同的方法可以做到这一点(例如三角形条),在本教程中,我们将使用所谓的元素缓冲区对象,这是一种缓冲区,允许我们重用顶点来创建多个基元。使用EBO,我们将能够仅使用四个顶点创建一个矩形。
将顶点数组替换为以下内容:
float[] vertices = {
0.5f, 0.5f, 0.0f, // top right
0.5f, -0.5f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f // top left
};
然后,在其下方添加以下数组:
uint[] indices = { // note that we start from 0!
0, 1, 3, // first triangle
1, 2, 3 // second triangle
};
索引数组将被馈送到我们的 EBO 中,以指定将使用哪些顶点来创建三角形。这个将使用顶点 0、1 和 3 创建一个三角形,使用 1、2 和 3 创建第二个三角形。
接下来,作为属性,在下面添加 VertexBufferObject 的行添加。int ElementBufferObject
现在,在 OnLoad 中,在初始化VertexBufferObject的下方,我们以大致相同的方式初始化 ElementBufferObject:
ElementBufferObject = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject);
GL.BufferData(BufferTarget.ElementArrayBuffer, indices.Length * sizeof(uint), indices, BufferUsageHint.StaticDraw);
这几乎与您使用VBO的方式完全相同!OpenGL的大多数缓冲区类型将遵循以下模式:使用GL.GenBuffer() 进行创建,使用GL.BindBuffer进行绑定,最后使用GL.BufferData向其添加数据。
EBO现已准备就绪。在OnRenderFrame中,将调用替换为DrawArrays
GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0);
参数依次为:
- 基元类型。就像上次一样,我们想使用原始三角形。
- 要绘制的顶点数量。我们使用索引的长度来绘制所有内容。
EBO元素的类型。无符号整数.- 我们要绘制的内容的偏移量。由于我们想绘制所有内容,因此我们只使用 0。
这就是它所需要的!如果你现在运行你的程序,你应该能够看到你有一个矩形而不是一个三角形。
文章讲述了如何在OpenGL中通过元素缓冲区对象(EBO)优化图形渲染,特别是如何使用EBO来创建矩形,从而减少顶点的浪费。通过定义顶点和索引数组,结合GL.DrawElements方法,实现了用四个顶点绘制矩形,提高了效率。
1594

被折叠的 条评论
为什么被折叠?



