c++ - 如何在 OpenGL3.2+ 中渲染多个形状和对象?

标签 c++ opengl

我正在遵循本指南 http://open.gl/学习如何使用现代 opengl 进行编程。我被困在一件事上。早些时候使用旧的 opengl Api,我曾经创建不同的函数来绘制不同类型的形状。像 drawRect()、drawCircle() 等。我需要做的就是在 glBegin() 和 glEnd() 中以不同的组合使用 glVertex3f()。

但在 OpenGl3.2+ 中,即使绘制一个矩形,我们也必须编写大量代码。我知道它可以让您更好地控制渲染,但是当您同时渲染多个东西(例如绘制矩形、圆形等)时,我不知道该怎么做。我是否需要多次编写所有代码(包括着色器),或者我可以重用代码。

我已经实现了这段代码http://open.gl/content/code/c2_triangle_elements.txt 这个例子画了一个矩形,但是如果我想在这个矩形旁边画一个三角形,那我该怎么做。

最佳答案

您可以重用大部分代码。所有着色器都可以加载一次并通过调用 glUseProgram 重新使用。对于所有缓冲区,您可以创建一次,然后根据需要多次重复使用它们。

您可能想要创建一些类,例如 ShaderClassShapeClass

基础着色器类通常有 2 或 3 个参数,如 programvertexShaderfragmentShader(都是一些 ID)。当您扩展它们时,还会添加着色器中的所有制服和属性,以便您稍后可以使用它们来修改您的绘图(例如更改颜色)。

ShapeClass 通常包含顶点缓冲区 ID(和可选的索引缓冲区 ID)和要绘制的顶点数。

所以最后当你想要绘制一些形状时,你只需要使用你已经创建和编译的着色器,从你的形状缓冲区绑定(bind)和设置顶点数据,然后调用绘制。

关于c++ - 如何在 OpenGL3.2+ 中渲染多个形状和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22755122/

相关文章:

c++ - OpenGL 天空盒问题

java - 使用 LWJGL 进行桌面捕获

c++ - 有没有办法让空的 boost 循环缓冲区的前端在缓存中保持热?

c++ - 使用 libcurl 上传文件到 DropBox

c++ - glDrawElements 成功但是 glDrawElementsInstance 失败并显示 GL_INVALID_OPERATION

java - 在 Java3D 中创建发光球体

c++ - 排序算法是什么(以及它在 GPU 上运行的效率如何)

c++ - 如何在 C++ 应用程序中构建原生 YouTube 播放器?

c++ - 仅特化模板函数实现的一部分

c++ - 使用 TColorListBox 更改矩形的颜色