gluCylinder() и смещение/множитель координат текстуры?

Как я могу установить смещение координат текстуры и множитель для функций gluCylinder() и gluDisk() и т. д.?

Поэтому, если обычно текстура начинается с точки 0, я бы хотел установить ее начало с точки 0,6 или 3,2 и т. Д. С помощью множителя я имею в виду, что текстура будет либо увеличиваться, либо уменьшаться.

Решение не может быть glScalef(), потому что 1) я использую нормали, 2) я также хочу настроить начальную позицию текстуры.


person Rookie    schedule 26.08.2011    source источник


Ответы (2)


Попробуйте использовать набор текстурной матрицы:

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(0.6f, 3.2f, 0.0f);
glScalef(2.0f, 2.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
drawObject();
person genpfault    schedule 27.08.2011
comment
разве это не должно быть glScalef(2.0f, 2.0f, 2.0f)? или Z имеет значение, только если я использую 3D-текстуры? тем не менее, я также установил координату Z на свой множитель, не видел никаких проблем с этим. - person Rookie; 27.08.2011
comment
Да, я почти уверен, что масштаб Z, отличный от 1,0, нужен только в том случае, если вы делаете 3D-текстуры или очень необычные 2D-материалы. - person genpfault; 27.08.2011
comment
@Rookie И имейте в виду, что удвоение координат текстуры вдвое уменьшает размер изображения текстуры на объекте. - person Christian Rau; 27.08.2011

Решение не имеет ничего общего с функциями GLU и действительно glScalefglTranslatef для настройки смещения), но применяется к матрице текстуры (при условии, что вы не используете шейдеры). Матрица текстуры, выбранная вызовом glMatrixMode с GL_TEXTURE, преобразует текстурные координаты вершин до того, как они будут интерполированы и использованы для доступа к текстуре (независимо от того, как эти координаты текстуры вычисляются, в данном случае GLU, который просто вычисляет их на ЦП). и звонит glTexCoord2f).

Итак, чтобы текстура начиналась с (0.1,0.2) (конечно, в пространстве текстуры) и увеличивалась в 2 раза, вы просто вызываете:

glMatrixMode(GL_TEXTURE);
glTranslatef(0.1f, 0.2f, 0.0f);
glScalef(0.5f, 0.5f, 1.0f);

перед вызовом gluCylinder. Но обязательно отмените эти изменения впоследствии (возможно, обернув их между glPush/PopMatrix).

Но если вы хотите изменить координаты текстуры на основе координат мирового пространства, это может потребовать дополнительных вычислений. И, конечно же, вы также можете использовать вершинный шейдер, чтобы иметь полный контроль над генерацией координат текстуры.

person Christian Rau    schedule 27.08.2011