在opengl中创建对象的正确方法?
我对opengl真的很陌生,现在我正在学习基础知识。我有一个高层次的问题。 如果我想创建一个对象,比如一列,所有选项是什么在opengl中创建对象的正确方法?,opengl,glut,vertex,Opengl,Glut,Vertex,我对opengl真的很陌生,现在我正在学习基础知识。我有一个高层次的问题。 如果我想创建一个对象,比如一列,所有选项是什么 从任何外部程序(如3DStudio)导入3D网格,并将其加载到opengl中 使用glVertex3f创建6个多边形 超负荷呼叫?(我见过glutSolidCube,但与glutSolidColumn完全不同) 我的问题是: A)还有其他方法吗? B) 如果不使用3DStudio网格,在opengl中创建普通对象/动画对象的正确方法是什么? C) 此代码在2中创建列是否正确
渲染对象只有一种方法,有几种方法。一种方法是为对象的每个(可见)面描述多边形 在OpenGL 1.x下,这意味着
glBegin
,glVertex
,glEnd
在OpenGL2.x下,这意味着glvertexinter
,glDrawArrays
(但1.x方式仍然有效)
在OpenGL 3.x下,这意味着创建顶点缓冲区对象、绑定它和glDrawArrays
(1.x和2.x方法仅在兼容模式下工作)
辅助函数(如
glutSolidCube
或用于加载模型网格的库)在内部使用这些相同的方法。渲染对象的方法只有一种,但也有几种。一种方法是为对象的每个(可见)面描述多边形
在OpenGL 1.x下,这意味着glBegin
,glVertex
,glEnd
在OpenGL2.x下,这意味着glvertexinter
,glDrawArrays
(但1.x方式仍然有效)
在OpenGL 3.x下,这意味着创建顶点缓冲区对象、绑定它和glDrawArrays
(1.x和2.x方法仅在兼容模式下工作)
辅助函数(如
glutSolidCube
或用于加载模型网格的库)在内部使用这些相同的方法。这取决于正确的定义。逐一回答:
glBegin/glVertex3f/glEnd因此不好,因为所有数据都位于CPU上,通过大量调用逐段传输到驱动程序。作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和GLDrawArray或glDrawElements(一步执行所有glBegin/glEnd调用的等效操作)。从这里开始,您可以通过顶点数组对象将数据存储在GPU上,而不是CPU上。这取决于您对正确数据的定义。逐一回答:
glBegin/glVertex3f/glEnd因此不好,因为所有数据都位于CPU上,通过大量调用逐段传输到驱动程序。作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和GLDrawArray或glDrawElements(一步执行所有glBegin/glEnd调用的等效操作)。从这里开始,您可以通过顶点数组对象将数据存储在GPU而不是CPU上。“逐段传输”。。。你在跟谁开玩笑?在调用
glFlush
或SwapBuffers
(或glReadPixels
)之前,驱动程序可以并且通常会对所有内容进行批处理。它在VBOs避免的每一帧上传输数据。顶点阵列可以最大限度地减少用户模式/驱动程序模式转换的次数,但不会影响数据发送到GPU的方式。小型系统上有相当多的驱动程序,它们会在每个glEnd传输,或者具有固定大小的小型内部缓冲区,并且会在其中一个缓冲区满时传输。正如我所说,我正在学习。因此,使用glVertex3f和glBegin/glEnd生成带有参数Z的列是可以学习的
//Column
//Wall
glBegin(GL_POLYGON);
glVertex3f(150.0f, 250.0f,50); // x1, y1 - top-left corner
glVertex3f(50.0f, 250.0f,50); // x2, y1 - top-right corner
glVertex3f(50.0f, 50.0f,50); // x2, y2 - bottom-right corner
glVertex3f(150.0f, 50.0f,50); // x1, y2 - bottom-left corner
glEnd( );
//Wall
glBegin(GL_POLYGON);
glVertex3f(50.0f, 250.0f,0); // x1, y1 - top-left corner
glVertex3f(150.0f, 250.0f,0); // x2, y1 - top-right corner
glVertex3f(150.0f, 50.0f,0); // x2, y2 - bottom-right corner
glVertex3f(50.0f, 50.0f,0); // x1, y2 - bottom-left corner
glEnd( );
//Wall
glBegin(GL_POLYGON);
glVertex3f(150.0f, 250.0f,0); // x1, y1 - top-left corner
glVertex3f(150.0f, 250.0f,50.0f); // x2, y1 - top-right corner
glVertex3f(150.0f, 50.0f,50.0f); // x2, y2 - bottom-right corner
glVertex3f(150.0f, 50.0f,0); // x1, y2 - bottom-left corner
glEnd( );
//Wall
glBegin(GL_POLYGON);
glVertex3f(50.0f, 250.0f,50); // x1, y1 - top-left corner
glVertex3f(50.0f, 250.0f,0); // x2, y1 - top-right corner
glVertex3f(50.0f, 50.0f,0); // x2, y2 - bottom-right corner
glVertex3f(50.0f, 50.0f,50); // x1, y2 - bottom-left corner
glEnd( );
//Floor
glBegin(GL_POLYGON);
glVertex3f(50.0f, 50.0f, 0); // x1, y1 - top-left corner
glVertex3f(50.0f, 50.0f, 50); // x2, y1 - top-right corner
glVertex3f(0, 50.0f, 50); // x2, y2 - bottom-right corner
glVertex3f(0, 50.0f, 0); // x1, y2 - bottom-left corner
glEnd( );
//Ceiling
glBegin(GL_POLYGON);
glVertex3f(50.0f, 250.0f, 0); // x1, y1 - top-left corner
glVertex3f(50.0f, 250.0f, 50); // x2, y1 - top-right corner
glVertex3f(0, 250.0f, 50); // x2, y2 - bottom-right corner
glVertex3f(0, 250.0f, 0); // x1, y2 - bottom-left corner
glEnd( );