OpenGL: как установить нормали и координаты текстуры в куб

Я делаю куб в OpenGL. Обычно я использовал мгновенный код, например:

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
};

но все, что мне удалось из этого получить, это уродливую грязную сцену с неработающим освещением и текстурами.


person NightKn8    schedule 15.10.2013    source источник


Ответы (1)


У вас должно быть одинаковое количество позиций, текстовых координат и нормалей. Индекс в вашем массиве indices указывает на триплет (pos, texcoord, normal). Таким образом, некоторые texcoords или нормали должны быть продублированы.

https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_05

вы можете использовать (хотя он не использует индексы) http://www.opengl-tutorial.org/beginners-tutorials/tutorial-4-a-colored-cube/

person fen    schedule 15.10.2013
comment
Спасибо :). Когда я добавил текстовые координаты и нормали ко всем своим вершинам, все заработало нормально! также у меня было слишком много данных в texcoords[]должно быть 2, а не 3 строки из-за 2 координат в: glTexCoordPointer(2, GL_FLOAT, 0, texcoords); - person NightKn8; 15.10.2013