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

现代OpenGL 3.x及以上版本如何绘制基本体?,opengl,glut,deprecated,primitive,Opengl,Glut,Deprecated,Primitive,我必须用OpenGL(3.3,4.2)绘制很多原语,我是用SolidTeapot()知道的;我可以用glut画一个茶壶 但是看起来这个命令不会生成顶点数组,我也不知道这种命令是否被弃用 我注意到很多现代OpenGL教程只加载自己的基本体,避免使用glut,甚至从3d网格格式文件加载简单的几何体 我的目的是尽可能快地绘制这些原语,并尽可能多地使用新的OpenGL 因此,如何在现代OpenGL中绘制基本体?使用新的(未弃用的)OpenGL标准进行渲染完全是通过使用着色器完成的 着色器属性只能是缓冲区

我必须用OpenGL(3.3,4.2)绘制很多原语,我是用SolidTeapot()知道的;我可以用glut画一个茶壶

但是看起来这个命令不会生成顶点数组,我也不知道这种命令是否被弃用

我注意到很多现代OpenGL教程只加载自己的基本体,避免使用glut,甚至从3d网格格式文件加载简单的几何体

我的目的是尽可能快地绘制这些原语,并尽可能多地使用新的OpenGL

因此,如何在现代OpenGL中绘制基本体?

使用新的(未弃用的)OpenGL标准进行渲染完全是通过使用着色器完成的

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

简而言之,客户机内存不是一组指定顶点位置、颜色、纹理坐标等的数组,而是将它们上传到缓冲区对象中。

作为GLUT(它无论如何都不是OpenGL的一部分)使用immediate mode
glBegin/glEnd
并使用不推荐使用的固定函数内置属性绘制其基本属性,如果您想专注于不推荐使用的现代核心功能,您将无法再使用这些属性

与使用内置属性(如
glVertex
glNormal
,…)不同,您必须使用自己的通用顶点属性(当然,与适当的顶点着色器结合使用)与
glBegin/glEnd
调用不同,您必须使用VBOs提供的顶点数组绘制基本体,并使用
glDrawArrays/glDrawElements
及其导数绘制基本体


虽然没有什么可以阻止您将这些对象的顶点数据存储为源代码中的变量,或者手动生成它们,但从文件加载它们是最简单、最通用的方法,至少对于犹他茶壶这样相当复杂的对象是如此。是一种非常简单的基于ASCII的网格文件格式,非常容易阅读,可能是研究的起点,因为它几乎可以由任何建模软件导出。

但是glut在基本体上的准确性如何?我注意到,如果从fbx或obj文件加载球体,将有50多行…@tomridle_1234:这50行处理文件I/O解析、创建缓冲区等。实际上,50行相当短。画一个立方体很容易。用C++代码绘制一个UV球,而不是从文件中加载。我在这里解释:GLUT茶壶是用类似的方法创建的(参数补丁的评估)。@ TimRIDLY1234:到目前为止,我刚刚写下了这个球的生成代码,以便回答。然而,我正在考虑为OpenGL编写一个小型、简单的原语库。无论如何,立方体是非常简单的,圆柱体和圆锥体是直的。茶壶最复杂,因为它需要参数化曲面。您可以查看GLUT源代码,了解它是如何完成的。我在这里找到了许多单元原语,他编写了一些lua脚本来生成单元原语xml文件。他创建了自己的格式,加载起来很复杂,但并不困难,而且非常方便。那么如何从glut中的原语中获取顶点缓冲区呢?打开glut源代码,将函数转换为吐出顶点,而不是绘制。我可以在哪里找到这些带有3d模型文件的单位对象,并轻松加载它们?如果我想要不同级别的细分呢