dat*_*olf 11
也许这让你感到惊讶,但是OpenGL没有像"模特"这样的资格.OpenGL的作用是,它接受大量数据,并且您可以让OpenGL访问这些数据,以便它对该数据执行的操作将在屏幕上产生一个漂亮的图像.
所以在介绍之后,假设你有一个模型,就像一个立方体.立方体由6个面组成,每个面有4个角.虽然每个角落位置由每个3个面共享,但是面部方向(所谓的"正常")在该角落上是非常不同的,这取决于您正在查看的面部.Position,Normal和一些其他属性形成所谓的顶点.因此,对于一个立方体,我们有6*4 = 24个顶点(资本位置,正常情况下)
X, Y, Z, x, y, z
-1, -1, -1, -1, 0, 0
-1, -1, 1, -1, 0, 0
-1, 1, 1, -1, 0, 0
-1, 1, -1, -1, 0, 0
1, -1, -1, 1, 0, 0
1, -1, 1, 1, 0, 0
1, 1, 1, 1, 0, 0
1, 1, -1, 1, 0, 0
…
Run Code Online (Sandbox Code Playgroud)
等等,我希望你能得到这个想法.每条线形成一个顶点矢量.该向量的格式是任意的.您可以将这些属性(位置,正常等)放在一个公共的交错数组中,或者为自己的数组中的每个属性使用多个数组.但是,交错阵列通常更有效.
与顶点列表一起,你还有一个面列表,即顶点索引的元组,对于一个面,所以在立方体的情况下那些元组,指定四边形将是
0, 1, 2, 3
4, 5, 6, 7
...
20, 21, 22, 23
Run Code Online (Sandbox Code Playgroud)
加载模型意味着,您编写了一些从模型文件格式读取数据的程序(最好是记录的文件格式,或者您自己想出的一个程序,并为您的建模程序编写导出程序).然后以上面概述的方式将读取的数据放入存储器中,以便OpenGL可以使用它.
然后,您将此数据提供给OpenGL.有两个选项:将数据保存在程序的进程地址空间(Client Side Vertex Arrays)中,或者将数据上载到OpenGL缓冲区对象(Vertex Buffer Object)中.
然后告诉OpenGL获取其几何数据.
对于客户端侧顶点阵列,这可以通过以下方式完成
GLenum primitive_mode;
GLfloat *vertex_data;
GLushort *indices_data;
int face_count;
void load_model(...)
{
/* ... */
read_vertex_data_from_file(&vertex_data,
&indices_data,
&face_count,
&primitive_mode, ...);
}
/*...*/
void draw_model()
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(
3, /* we're supplying vectors of which the 3 first elements are to be used for vertex position */
GL_FLOAT, /* the type of each vector element is GLfloat */
sizeof(GLfloat)*6, /* the beginnings of vectors in vertex_data are 6 * sizeof(GLfloat) apart */
vertex_data + 0 /* the pointer to the data, positions are offset 0 */
);
glNormalPointer( /* normals always have 3 elements, no size given */
GL_FLOAT, /* the type of each vector element is GLfloat */
sizeof(GLfloat)*6, /* the beginnings of vectors in vertex_data are 6 * sizeof(GLfloat) apart */
vertex_data + 3 /* the pointer to the data, normals are offset 3 */
);
glDrawElements(primitive_mode, face_count, GL_UNSIGNED_SHORT, indices_data);
}
Run Code Online (Sandbox Code Playgroud)
您可以自己实现模型加载器,也可以使用某些第三方库来完成此任务.