Modern OpenGL 3.x 及更高版本如何绘制图元?
我必须使用 OpenGL (3.3, 4.2) 绘制大量基元,我知道 glutSolidTeapot() ;我可以用 glut 画一个茶壶基元。
但似乎这个命令不会生成顶点数组,而且我不知道这种命令是否已被弃用。
我注意到许多现代 OpenGL 教程只是加载自己的图元并避免仅使用 glut,他们甚至从 3d 网格格式文件加载简单的几何图形。
我的目的是尽可能快地绘制这些图元。并尽可能多地使用新的 OpenGL。
那么现代OpenGL如何绘制图元呢?
I must draw lots of primitives with OpenGL (3.3, 4.2), I knew with glutSolidTeapot() ; I can draw a teapot primitive with glut.
But it seems there won't be a vertex array generated from this command, and I don't know if this kind of commands are deprecated or not.
And I noticed lots of modern OpenGL tutorials just loads their own primitives and avoided to just use glut, they even loaded simple geometry from 3d mesh format file.
My purpose is to just draw these primitives as quick as possible.And use the new OpenGL as much as possible.
So that how to draw primitives in modern OpenGL?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于 GLUT(无论如何都不是 OpenGL 的一部分)使用立即模式
glBegin/glEnd
并使用已弃用的固定函数内置属性来绘制其基元,因此您不会如果您想专注于未弃用的现代核心功能,则可以再使用它们。您必须使用自己的通用顶点属性(当然,与适当的顶点着色器结合使用),而不是使用内置属性(例如
glVertex
、glNormal
...) ),而不是使用glBegin/glEnd
调用,您必须使用 VBO 提供的顶点数组绘制基元,并使用glDrawArrays/glDrawElements
及其它们绘制衍生物。虽然没有什么可以阻止您将这些对象的顶点数据作为变量存储在源代码中或手动生成它们,但从文件加载它们是最简单和最通用的方法,至少对于像犹他茶壶这样相当复杂的对象来说是这样。 Wavefront OBJ 格式 是一种相当简单的基于 ASCII 的网格文件格式,非常易于阅读这可能是一个研究的起点,因为它几乎可以通过任何建模软件导出。
As GLUT (which is not part of OpenGL in any way) draws its primitves using immediate mode
glBegin/glEnd
and using the deprecated fixed-function builtin attributes, you won't be able to use these anymore, if you want to concentrate on non-deprecated, modern core functionality.Instead of using the builtin attributes (like
glVertex
,glNormal
, ...) you have to use your own generic vertex attributes (in conjunction with an appropriate vertex shader, of course) and instead ofglBegin/glEnd
calls you have to draw primitives using vertex arrays fed by VBOs and drawn usingglDrawArrays/glDrawElements
and their derivatives.Whereas nothing prevents you from storing the vertex data for these objects as variables in your source code or to generate them manually, loading them from files is the easiest and most generic way, at least for such rather complex objects like the Utah teapot. The Wavefront OBJ format is a rather simple ASCII based mesh file format that is quite easy to read and might be a starting point to look into, as it can be exported by virtually any modelling software.
使用新的(未弃用的)OpenGL 标准进行的渲染完全通过使用着色器来完成。
Shader属性只能是buffer对象。
很快,客户端内存不再是一组指定顶点位置、颜色、纹理坐标等的数组,而是必须将它们上传到缓冲区对象中。
Rendering with the new (non deprecated) OpenGL standards is done exclusively by using shaders.
Shader attribute can only be buffer objects.
Shortly, instead of having a set of arrays that specify vertex positions, colors, texture coordinates and so on, is client memory, you havfe to upload them in buffer objects.