现代OpenGL 3.x及以上如何绘制基本图形?

5
我需要使用OpenGL(3.3, 4.2)绘制许多基本图形,我知道可以通过glutSolidTeapot()函数来绘制茶壶基本图形。
但是似乎没有从该命令生成顶点数组,并且我不知道这种命令是否已过时。
我注意到许多现代OpenGL教程只加载自己的基本图形并避免使用glut,他们甚至从3D网格格式文件中加载简单的几何体。
我的目的是尽快地绘制这些基本图形,并尽可能地使用新的OpenGL。
那么如何在现代OpenGL中绘制基本图形呢?

那么如何从glut中的基元获取顶点缓冲区? - tomriddle_1234
1
打开GLUT源代码并将函数转换为输出顶点而不是绘制。 - genpfault
2个回答

8
作为GLUT(在任何情况下都不是OpenGL的一部分)使用立即模式glBegin/glEnd以及使用已弃用的固定功能内置属性来绘制其基元,如果要专注于非已弃用的现代核心功能,则将无法再使用它们。
您必须使用自己的通用顶点属性(当然,与适当的顶点着色器结合使用),而不是使用内置属性(如glVertex、glNormal等),并且必须使用由VBO提供数据并使用glDrawArrays/glDrawElements及其派生函数绘制基元,而不是使用glBegin/glEnd调用绘制基元。
虽然没有什么阻止您将这些对象的顶点数据存储为源代码中的变量或手动生成它们,但从文件加载它们是最简单和最通用的方式,至少对于像犹他茶壶这样相当复杂的对象而言。Wavefront OBJ格式是一种相当简单的基于ASCII的网格文件格式,很容易阅读,可能是一个入门的起点,因为它可以由几乎任何建模软件导出。

但是关于原始数据,Glut的准确性如何?我注意到如果从FBX或OBJ文件中加载一个球体,将会有超过50行的代码... - tomriddle_1234
1
@tomriddle_1234:这50行代码涉及文件I/O解析、创建缓冲区等。实际上,50行代码相当短。绘制一个立方体很容易。使用仅有的C++代码绘制UV球体,而不是从文件中加载,我在这里解释了:https://dev59.com/Om025IYBdhLWcg3weF2S#5989676 GLUT茶壶也是以类似的方式创建的(评估参数化补丁)。 - datenwolf
1
@tomriddle_1234:到目前为止,我只是为了那个SO答案写下了这个球体生成代码。不过我在考虑为OpenGL编写一个小型、简单的基本库。无论如何,立方体非常简单,圆柱和圆锥也很直接。茶壶最复杂,因为它需要评估参数曲面。你可以查看GLUT源代码来了解它是如何完成的。 - datenwolf
我从这里 https://bitbucket.org/alfonse/gltut/downloads 找到了许多基本单元,他编写了一些Lua脚本来生成基本单元的XML文件。他创建了自己的格式,虽然加载有点复杂但不难,而且非常方便。 - tomriddle_1234

2

使用新的(非废弃)OpenGL标准进行渲染是通过使用着色器来完成的。

着色器属性只能是缓冲对象。

简而言之,不再像以前一样在客户端内存中拥有一组数组来指定顶点位置、颜色、纹理坐标等,而是必须将它们上传到缓冲对象中。


我可以在哪里找到带有3D模型文件的这些单元对象,并轻松地加载它们吗?如果我想要不同程度的细分,该怎么办? - tomriddle_1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接