我真的很喜欢opengl,现在我正在学习基础知识。我有一个高级别的问题。 如果我想创建一个对象,请说一个列是所有选项吗?
我的问题是:
A)还有其他办法吗?
B)如果不使用3DStudio网格,在opengl中创建普通对象/动画对象的正确方法是什么?
C)这个代码在2)中创建列是否正确?(如果是,我将尝试使用x,y,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( );
答案 0 :(得分:5)
这取决于你对正确的定义。逐一回答:
Re:glVertex3f和glBegin / glEnd调用。目前,当你学习时,它们很好,这是一种让你研究渲染管道其他部分的简单方法。但是,它们已经被弃用并且不是最理想的,因此不是您想要永久约束的东西。因此,它们不会在OpenGL ES或WebGL中复制。
CPU和GPU之间的任何通信都会产生相关成本。您在通信中传输的数据越多,成本就越高。但是,由于两个异步和并行设备之间需要临时同步,即使很小的调用也要花费很多。
因此,glBegin / glVertex3f / glEnd是错误的,因为所有数据都位于CPU上并通过大量调用传递给驱动程序。作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和glDrawArrays或glDrawElements(一步执行所有glBegin / glEnd调用的等效操作)。从那里你可以转移到通过顶点数组对象将数据存储在GPU而不是CPU上。答案 1 :(得分:4)
渲染对象只有一种方法,有几种方法可以实现。一种方法是为对象的每个(可见)面描述一个多边形。
在OpenGL 1.x下,这意味着glBegin
,glVertex
,glEnd
。
在OpenGL 2.x下,这意味着glVertexPointer
,glDrawArrays
(但1.x方式仍有效)
在OpenGL 3.x下,这意味着创建一个顶点缓冲区对象,绑定它,glDrawArrays
(1.x和2.x方法仅在兼容模式下工作)。
辅助函数(如glutSolidCube
)或用于加载模型网格的库在内部使用这些相同的方法。