Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Chast_II_Osn_progr_trekhmernoy_grafiki.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.83 Mб
Скачать

4. Автоматическое повторение текстуры на плоском многоугольнике

Режим автоматического повторения текстуры включается/выключается с помощью свойств текстуры GL_TEXTURE_WRAP_S и GL_TEXTURE_WRAP_T. Буквами S и T в OpenGL обозначаются горизонтальная и вертикальная координата текстуры. Для автоповторения текстуры в заданном направлении соответствующее свойство должно быть равно GL_REPEAT (значение по умолчанию). Для отключения автоповторения этому свойству надо присвоить значение GL_CLAMP.

Ниже приведены изменения, которые надо внести в функцию display() программы 7.1, чтобы текстура на передней грани куба была повторена 3 раза по горизонтали и 2 раза по вертикали.

void CALLBACK display()

{

  ...

  glBindTexture( GL_TEXTURE_2D, falls_tex );

  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );

  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

  glBegin( GL_QUADS );

    glTexCoord2d( 0, 0 ); glVertex3d( -3, -3, 0 );

    glTexCoord2d( 0, 2 ); glVertex3d( -3, 3, 0 );

    glTexCoord2d( 3, 2 ); glVertex3d( 3, 3, 0 );

    glTexCoord2d( 3, 0 ); glVertex3d( 3, -3, 0 );

  glEnd();

  ...

}

Фрагмент программы 7.2. Автоматическое повторение текстуры.

Функция glTexCoord2d() сопоставляет координаты текстуры и вершин примитива. Координаты левого нижнего угла текстуры равны (0,0), а правого верхнего – (1,1). Если в качестве параметров glTexCoord2d() указать значение, большее 1, то текстура будет повторяться (рис. 7.4). В программе 7.2 координата (0,0) текстуры привязывается к левой нижней вершине грани куба с координатой (-3,-3,0), а координата (3,2) текстуры – к правой верхней вершине (3,3,0). В результате по горизонтали на грань куба будет наложено три экземпляра текстуры, а по вертикали – 2 экземпляра.

Рис. 7.4. Задание координат для автоматического повторения текстуры.

5. Наложение текстуры на произвольную поверхность

В OpenGL есть режим автоматической генерации текстурных координат. Этот режим позволяет отказаться от использования glTexCoord2d() при решения нескольких типичных задач, таких, как демонстрация очертаний объекта с помощью контуров и построение отражения окружающей среды на блестящих объектах.

Для применения этого режима сначала требуется разрешить автоматическую генерацию координаты текстуры по одному или обоим направлениям с помощью вызова glEnable(GL_TEXTURE_GEN_S) и glEnable(GL_TEXTURE_GEN_T). После этого надо с помощью функции glTexGen() выбрать способ генерации текстурных координат.

void glTexGen{ifd}{v}(GLenum coord, GLenum pname, TYPE param);

Параметр coord выбирает координату GL_S или GL_T. Второй параметр pname равен GL_TEXTURE_GEN_MODE, а param задает функцию вычисления текстурных координат: GL_OBJECT_LINEAR, GL_EYE_LINEAR или GL_SPHERE_MAP.

Функции расчета текстурных координат GL_OBJECT_LINEAR и GL_EYE_LINEAR в основном применяются для нанесения контурных изображений на объект, чтобы показать его форму (например, с помощью одномерной текстуры в виде полоски).

Функция GL_SPHERE_MAP предназначена для имитации отражения окружающей среды блестящими объектами. Например, если посмотреть на полированный серебряный предмет внутри комнаты, то на его поверхности будет видно отражение стен, пола и предметов, находящихся внутри комнаты. Вид отражения зависит от положения наблюдателя и от ориентации блестящего предмета.

Отображение GL_SPHERE_MAP строится в предположении, что предметы в комнате расположены достаточно далеко от поверхности блестящего объекта и этот объект очень мал по сравнению с размерами комнаты. В таком приближении, чтобы рассчитать цвет точки поверхности объекта, выполняется построение луча от наблюдателя до поверхности и затем рассчитывается отражение этого луча от поверхности объекта. Направление отраженного луча определяет цвет пиксела объекта. Для применения режима GL_SPHERE_MAP необходимо подготовить текстуру специальным образом, так, чтобы она была похожа на фотографию реального блестящего объекта, сделанную с помощью широкоугольного объектива.

В целом, применение любой из трех описанных функций для получения регулярной текстуры на объекте является довольно сложным делом. Наложение нерегулярных хаотических текстур выполняется значительно проще и в ряде случаев может дать приемлемые результаты. В приведенной ниже функции display() из программы 7.3 демонстрируется наложение двух текстур на стандартные объекты GLAUX с применением трех различных функций генерации текстурных координат.

void CALLBACK display()

{

  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  glEnable( GL_TEXTURE_2D );

  glEnable( GL_TEXTURE_GEN_S );

  glEnable( GL_TEXTURE_GEN_T );

  glColor3d( 1, 1, 1 );

  glPushMatrix();

    glTranslated( -3, 3, 0 );

    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );

    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );

    glBindTexture( GL_TEXTURE_2D, falls_tex );

    auxSolidTeapot( 1.5 );

    glTranslated( 6, 0, 0 );

    glBindTexture( GL_TEXTURE_2D, sawdust_tex );

    auxSolidTeapot( 1.5 );

  glPopMatrix();

  glPushMatrix();

    glTranslated( -3, 0, 0 );

    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR );

    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR );

    glBindTexture( GL_TEXTURE_2D, falls_tex );

    auxSolidTeapot( 1.5 );

    glTranslated( 6, 0, 0 );

    glBindTexture( GL_TEXTURE_2D, sawdust_tex );

    auxSolidTeapot( 1.5 );

  glPopMatrix();

  glPushMatrix();

    glTranslated( -3, -3, 0 );

    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );

    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );

    glBindTexture( GL_TEXTURE_2D, falls_tex );

    auxSolidTeapot( 1.5 );

    glTranslated( 6, 0, 0 );

    glBindTexture( GL_TEXTURE_2D, sawdust_tex );

    auxSolidTeapot( 1.5 );

  glPopMatrix();

  glDisable( GL_TEXTURE_GEN_S );

  glDisable( GL_TEXTURE_GEN_T );

  glDisable( GL_TEXTURE_2D );

  auxSwapBuffers();

}

Фрагмент программы 7.3. Автоматическое наложение текстур.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]