Повторяющаяся проблема текстуры - PullRequest
2 голосов
/ 20 ноября 2011

Я пытаюсь отобразить изображение на NURBS-поверхности.У меня есть массив 13x13 одинаково расположенных контрольных точек в квадратах (-1, -1), (-1, 1), (1, 1), (1, -1).Я пытаюсь отобразить текстуру на поверхность NURBS, контролируемую контрольными точками, используя следующий код:

gluNurbsSurface(nurbs_object,no_knots,&knots[0],no_knots,&knots[0],u_stride,v_stride,&ctr_points[0][0],u_order,v_order,GL_MAP2_TEXTURE_COORD_2);
gluNurbsSurface(nurbs_object,no_knots,&knots[0],no_knots,&knots[0],u_stride,v_stride,&ctr_points[0][0],u_order,v_order,GL_MAP2_VERTEX_3);
gluNurbsSurface(nurbs_object,no_knots,&knots[0],no_knots,&knots[0],u_stride,v_stride,&ctr_points[0][0],u_order,v_order,GL_MAP2_NORMAL);

Ниже приведены параметры, с которыми я инициализирую свою программу:

gluNurbsProperty(nurbs_object, GLU_SAMPLING_TOLERANCE, 50.0);
gluNurbsProperty(nurbs_object, GLU_DISPLAY_MODE, GLU_FILL);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image_width, image_height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);

Проблема, с которой я сталкиваюсь, состоит в том, что у меня есть изображение текстуры, повторяющееся 4 раза вокруг источника, т.е. вместо текстуры 2x2 у меня есть 4 текстуры 1x1.

Куда я иду неправильно?И как я могу это исправить?

1 Ответ

1 голос
/ 20 ноября 2011

Текстура имеет диапазон координат [0, 0] -> [1, 1].Поскольку для обтекания текстур по умолчанию установлено значение GL_REPEAT, используемые координаты дают размер плитки 2x2, который вы наблюдаете.NURBS поверхность используется для координат текстуры или масштабирования координат текстуры другим способом.Последний может быть менее навязчивым:

GLint mmode;

glGetIntegerv(GL_MATRIX_MODE, & mmode); /* save active matrix stack. */
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glScalef(0.5, 0.5, 1.0);

/* ... draw ... */

glPopMatrix();
glMatrixMode((GLenum) mmode); /* restore active matrix stack. */
...