我在OpenGL中制作一个立方体。 Normaly我使用了即时代码:
glNormal3f(0.0,1.0,0.0);
glTexCoord2f(0.0f,0.0f);
glVertex3f( 0.5f, 0.5f,-0.5f);
...
有点弃用。现在我使用vertices[]
和indices[]
以及glDrawElements
来处理多维数据集:
static float vertices[] =
{
-0.5000, -0.5000, 0.5000,
0.5000, -0.5000, 0.5000,
-0.5000, 0.5000, 0.5000,
-0.5000, 0.5000, 0.5000,
0.5000, -0.5000, 0.5000,
0.5000, 0.5000, 0.5000,
-0.5000, -0.5000, -0.5000,
-0.5000, 0.5000, -0.5000,
0.5000, -0.5000, -0.5000,
0.5000, -0.5000, -0.5000,
-0.5000, 0.5000, -0.5000,
0.5000, 0.5000, -0.5000,
0.5000, -0.5000, -0.5000,
0.5000, 0.5000, -0.5000,
0.5000, -0.5000, 0.5000,
0.5000, -0.5000, 0.5000,
0.5000, 0.5000, -0.5000,
0.5000, 0.5000, 0.5000,
-0.5000, -0.5000, -0.5000,
-0.5000, -0.5000, 0.5000,
-0.5000, 0.5000, -0.5000,
-0.5000, 0.5000, -0.5000,
-0.5000, -0.5000, 0.5000,
-0.5000, 0.5000, 0.5000,
-0.5000, -0.5000, -0.5000,
0.5000, -0.5000, -0.5000,
-0.5000, -0.5000, 0.5000,
-0.5000, -0.5000, 0.5000,
0.5000, -0.5000, -0.5000,
0.5000, -0.5000, 0.5000,
-0.5000, 0.5000, -0.5000,
-0.5000, 0.5000, 0.5000,
0.5000, 0.5000, -0.5000,
0.5000, 0.5000, -0.5000,
-0.5000, 0.5000, 0.5000,
0.5000, 0.5000, 0.5000,
};
static byte indices[] =
{
0, 1, 2,
3, 4, 5,
18, 19, 20,
21, 22, 23,
12, 13, 14,
15, 16, 17,
6, 7, 8,
9, 10, 11,
30, 31, 32,
33, 34, 35,
24, 25, 26,
27, 28, 29
};
问题在于我不知道如何正确设置法线和纹理坐标,因此场景是正确的。如何用给定的数据计算它们?我试过这样做:
glNormalPointer( GL_FLOAT, 0, normals);
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
和这个数据:
static float normals[] =
{
-1.0000, -1.0000, 1.0000,
1.0000, -1.0000, 1.0000,
-1.0000, 1.0000, 1.0000,
-1.0000, 1.0000, 1.0000,
1.0000, -1.0000, 1.0000,
1.0000, 1.0000, 1.0000,
};
static float texcoords[] =
{
1.0000, 0.0000, 0.0000,
1.0000, 1.0000, 0.0000,
0.0000, 1.0000, 0.0000,
0.0000, 0.0000, 0.0000
};
但是我设法从中获得的是一个丑陋凌乱的场景,灯光和纹理都破了。
答案 0 :(得分:1)
您需要相同数量的位置,textcoords和法线。 indices
数组中的索引指向三元组(pos,texcoord,normal)。因此,一些texcoords或normals将不得不重复。
https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_05
你可以依据(尽管它不使用索引) http://www.opengl-tutorial.org/beginners-tutorials/tutorial-4-a-colored-cube/