2013-10-15 4 views
0

Я делаю куб в 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 
}; 

Проблема заключается в том, что я не знаю, как установить нормалей и текстурных COORDS правильно, так что сцена будет правильно. Как я могу подсчитать их с данными? Я пытался сделать это с:

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

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

ответ

1

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

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

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

+0

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

Смежные вопросы