Вы не можете просто тесселяции части полигона, и он будет работать, вам нужно тесселяции всего полигона, что-то вроде этого:
//fix for windows C++:
#ifndef CALLBACK
#define CALLBACK
#endif
tobj = gluNewTess();
gluTessCallback(tobj, GLU_TESS_VERTEX,
(GLvoid (CALLBACK*) ()) &glVertex3dv);
gluTessCallback(tobj, GLU_TESS_BEGIN,
(GLvoid (CALLBACK*) ()) &glBegin);
gluTessCallback(tobj, GLU_TESS_END,
(GLvoid (CALLBACK*) ()) &glEnd);
gluTessBeginPolygon(tobj, NULL);
gluTessBeginContour(tobj);
for(int i=0; i<7;i++)
gluTessVertex(tobj, car[i], car[i]);
//call gluTessVertex for EVERY vertex in the polygon here
gluTessEndContour(tobj);
gluTessEndPolygon(tobj);
Кроме того, вам нужно указать все 3 компонентавершины как GLdouble
.Таким образом, это было бы что-то вроде этого (все еще пропуская некоторые вершины, конечно):
GLdouble car[7][3] = { {-1.93,0.3,0.0}, {-1.95,0.4,0.0}, {-2.2,0.6,0.0}, {-2.6,0.6,0.0}, {-2.82,0.4,0.0}, {-2.8,0.3,0.0}, {-2.78,0.0,0.0} };
Чтобы дать каждой вершине координату текстуры, вам нужно написать свою собственную функцию, которая принимает void *
(которыйбудет содержать указатель на координаты x, y, z вершины) и вызовет glVertex
и glTexCoord
.
Также следует избегать тесселяции в каждом кадре, поэтому следует либо сохранять вызовы между gluTessBeginPolygon
и gluTessEndPolygon
в списке отображения, или еще лучше, если ваша функция GLU_TESS_VERTEX
сохраняет вершины в VBO.
Возможно, вам также потребуется определить обратный вызов GLU_TESS_COMBINE
, посмотрите здесь и здесь для получения подробной информации и примера кода.
edit2: На самом деле текстурирование не так просто.Это старый устаревший код, который, вероятно, все еще работает для вас, но очень ненадежен, особенно если вы используете шейдеры.Для более современной версии посмотрите на эту тему .Вы должны удалить вызовы glTexCoord2d()
, и это должно войти в функцию рисования:
//adjust these values to the object/texture size
GLfloat scalex = 1.0;
GLfloat scaley = 1.0;
GLfloat offsetx= 0.0;
GLfloat offsety= 0.0;
//GLdouble gens[4] = {1.0,0.0,0.0,0.0};
//GLdouble gent[4] = {0.0,1.0,0.0,0.0};
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGend(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
glTexGend(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
//glTexGendv(GL_S,GL_OBJECT_PLANE,gens);
//glTexGendv(GL_T,GL_OBJECT_PLANE,gent);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScalef(scalex,scaley,1.0f);
glTranslatef(offsetx,offsety,0.0);
//do the normal rendering
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
...
Кроме того, помните, что тесселяция каждого кадра все еще не является хорошей идеей ни для чего, кроме небольших тестов, лучше использовать его вместесо списком отображения или VBO, как указано ранее, будет более эффективным.