如何使用 glDrawElements() 绘制硬面立方体? [复制]

Posted

技术标签:

【中文标题】如何使用 glDrawElements() 绘制硬面立方体? [复制]【英文标题】:How to use glDrawElements() to draw hard surfaced cubes? [duplicate] 【发布时间】:2016-03-22 18:10:53 【问题描述】:

通过使用元素缓冲区,您可以发送指示哪些顶点用于特定面的索引。但是正常人呢?如果我想用基本的漫反射着色器渲染一个立方体,我会得到平滑的法线(如果我之前平滑它们)。然而,当尝试渲染像立方体这样的硬表面边缘时,我无法绘制硬边缘,因为一些面共享相同的顶点。

有没有办法仍然将元素缓冲区用于硬表面对象?

我不喜欢在使用 glDrawArrays() 时浪费内存。

【问题讨论】:

【参考方案1】:

一般来说,“顶点”(在 OpenGL 术语中)应该包含渲染它所需的所有必要信息。这包括位置,但可能(在您的情况下可能应该)还包括纹理坐标、法线等。因此,如果您正在使用两个具有相同位置但纹理坐标或法线不同的顶点(这是相当在处理立方体或其他“平面阴影”对象接缝时很常见),您应该将它们存储为唯一的顶点。

如果您这样做,您仍然可以使用元素缓冲区。您将不得不增加顶点缓冲区对象的内存大小,如果您要渲染像立方体这样简单的东西,您可能不会节省太多内存,但您的元素缓冲区对象不应该比以前大,如果你做对了。

【讨论】:

以上是关于如何使用 glDrawElements() 绘制硬面立方体? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:glDrawElements 不绘制

使用 glDrawElements 绘制 std::vector

glDrawElements() 在无效情况下返回 GL_INVALID_ENUM

使用 glDrawElements、Index Buffer 和启用的 GL_CULL_FACE 横向绘制圆柱体

我的OpenGL学习进阶之旅使用glDrawElements绘制的时候,不绘制任何图元,报错 1282 即 GL_INVALID_OPERATION

我的OpenGL学习进阶之旅使用glDrawElements绘制的时候,不绘制任何图元,报错 1282 即 GL_INVALID_OPERATION