使用 glDrawElements 从 WRL (VRML) 文件中绘制对象

Posted

技术标签:

【中文标题】使用 glDrawElements 从 WRL (VRML) 文件中绘制对象【英文标题】:Using glDrawElements to draw object from WRL (VRML) file 【发布时间】:2012-01-28 01:41:21 【问题描述】:

我正在尝试使用 OpenGL 对 WRL (VRML) 文件中描述的对象进行建模。

我并不真正关心解析文件,我认为这部分会相当简单。在这个阶段,我只是尝试在顶点数组和索引数组中进行硬编码,以便我可以很好地理解它是如何工作的,从而可以概括任何 WRL 输入文件。

我首先尝试一个基本的盒子(矩形棱柱)模型。我目前有这个顶点数组:

GLfloat vertices[] = 
     -0.200000, -0.025000, -0.050000,
     -0.200000, -0.025000, 0.050000, 
     -0.200000, 0.025000, -0.050000, 
     -0.200000, 0.025000, 0.050000, 
      0.200000, -0.025000, -0.050000,
      0.200000, -0.025000, 0.050000, 
      0.200000, 0.025000, -0.050000, 
      0.200000, 0.025000, 0.050000
;

还有这个索引数组:

GLubyte indices[] = 
     7, 3, 5, -1, 5, 3, 1, -1,
     6, 2, 7, -1, 7, 2, 3, -1, 
     4, 0, 6, -1, 6, 0, 2, -1,
     5, 1, 4, -1, 4, 1, 0, -1,
     2, 0, 3, -1, 3, 0, 1, -1,
     4, 6, 5, -1, 5, 6, 7, -1
;

直接来自 WRL 文件 Coordinate3 point []IndexedFaceSet coordIndex []

然后我通过调用来启用顶点数组功能:

glEnableClientState(GL_VERTEX_ARRAY);

并设置 glVertexPointer:

glVertexPointer(3, GL_FLOAT, 0, vertices);

最后我使用 glDrawElements 函数来绘制盒子:

glDrawElements(GL_POLYGON, 24, GL_UNSIGNED_BYTE, indices);

然后停用顶点数组功能:

glDisableClientState(GL_VERTEX_ARRAY);

因此,在此之后,我希望绘制一个框,当我使用 glDrawElements(GL_POINTS, 24, GL_UNSIGNED_BYTE, indices); 时,它会显示 8 个顶点,如果正确的顶点与线连接,将代表预期的框(除了那里是中间的一个点,但是当我使用 26 作为计数参数时,中间的点就会消失)

但是,当我在 glDrawElements 的第一个参数中使用 GL_POLYGON 或 GL_LINE_LOOP 时,我得到了垃圾。 8 个顶点显然在那里,但它们以非常奇怪的方式连接起来。

我现在很困惑,我什至不确定我这样做是否正确。也许有人至少可以把我引向正确的方向?

【问题讨论】:

【参考方案1】:

矩形棱柱不是GL_POLYGON。注意这个词的单数形式:多边形。就像 one 多边形一样。一个矩形棱柱是由许多多边形组成的,而不仅仅是一个。

你想要的是画一些GL_TRIANGLES。创建一个索引列表,显示组成框的每个三角形。这意味着每个盒子面由两个三角形组成,因此您总共需要 12 个三角形。这意味着 36 个索引。

【讨论】:

谢谢,这也适用于更复杂的 3D 形状,还是有更好的方法来渲染这些形状? 这或多或少是渲染一切的方式。 GL_TRIANGLE_STRIP 有时可以使用,但它需要一些设置工作。您必须正确构建索引列表以及所有内容。

以上是关于使用 glDrawElements 从 WRL (VRML) 文件中绘制对象的主要内容,如果未能解决你的问题,请参考以下文章

我不明白的 glDrawElements 的使用

当我尝试从 vbo 获取颜色时,glDrawElements 没有输出

WinRT WRL ABI 集合

为啥 glDrawElments() 在不使用任何着色器的情况下工作?

WRL::ComPtr 导致 d3d 中的对象泄漏?

将 WRL 用于 C++/CX 函数 - 链接器错误 [重复]