Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 980 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 10:

Текстура

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

Координаты текстуры

Задание координат текстуры позволяет сопоставить вершины примитивов с изображением текстуры. Вне зависимости от размера изображения текстуры в пикселах, координаты текстуры определяются библиотекой OpenGL в интервале значений [0, 1].

Для правильного изображения текстуры координата текстуры, соответствующая вершине, должна определяться с помощью команды TexCoord перед заданием координат соответствующей вершины примитива.

В библиотеке OpenTK (C#) команда реализуется с помощью набора статических методов класса GL с различними типами параметров, в Object Pascal – с помощью набора процедур. Ниже приведен вариант для случая, когда координаты указываются в качестве значений типа float:

C#:
  void TexCoord2(float s, float t);
Object Pascal:
  procedure glTexCoord2f (s,t: GLfloat);

Параметры:

  • s – горизонтальная координата текстуры;
  • t – вертикальная координата текстуры.

Ниже приведен пример наложения текстуры на квадрат ( рис. 9.1).

GL.Begin(BeginMode.Quads);
GL.TexCoord2(0.0f, 0f);
GL.Vertex2(-0.5f, -0.5f);
GL.TexCoord2(0.0f, 1f);
GL.Vertex2(-0.5f, 0.5f);
GL.TexCoord2(1f, 1f);
GL.Vertex3(0.5f, 0.5f);
GL.TexCoord2(1f, 0f);
GL.Vertex3(0.5f, -0.5f);
GL.End();
Листинг 9.6. Пример наложения текстуры на квадрат на C# с использованием библиотеки OpenTK
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex2f(-0.5, -0.5);
glTexCoord2f(0,1);
glVertex2f(-0.5, 0.5);
glTexCoord2f(1,1);
glVertex2f(0.5, 0.5);
glTexCoord2f(1,0);
glVertex2f(0.5, -0.5);
glEnd;
Листинг 9.7. Пример наложения текстуры на квадрат на Object Pascal
Результат наложения текстуры на квадрат

Рис. 9.1. Результат наложения текстуры на квадрат

Если необходимо, чтобы изображение дублировалось при наложении на примитив по горизонтали и/или вертикали, то в этом случае при задании координат текстуры необходимо указать значение больше 1. В листингах 9.8 и 9.9 приведен пример наложения текстуры, в котором изображение повторяется 4 раза по вертикали и по горизонтали ( рис. 9.2).

int w = 4;
int h = 4;
…
GL.Begin(BeginMode.Quads);
GL.TexCoord2(0.0, w); GL.Vertex3(-1.0f,  1.0f, 0.0f);
GL.TexCoord2(0.0, 0.0); GL.Vertex3(-1.0f, -1.0f, 0.0f);
GL.TexCoord2(h, 0.0); GL.Vertex3(1.0f, -1.0f, 0.0f);
GL.TexCoord2(h, w); GL.Vertex3( 1.0f,  1.0f, 0.0f);
GL.End();
Листинг 9.8. Пример дублирования изображения текстуры на C#
var
 w,h: Integer;
 begin
 … 
 w := 4; h := 4;
 glEnable(GL_TEXTURE_2D);
 glBegin(GL_QUADS);
   glTexCoord2f(0.0, w);    glVertex3f(-1.0,  1.0, 0.0);
   glTexCoord2f(0.0, 0.0);  glVertex3f(-1.0, -1.0, 0.0);
   glTexCoord2f(h, 0.0);    glVertex3f( 1.0, -1.0, 0.0);
   glTexCoord2f(h, w);     glVertex3f( 1.0,  1.0, 0.0);
 glEnd;
 glDisable(GL_TEXTURE_2D);
 …
 end; 
Листинг 9.9. Пример дублирования изображения текстуры на Object Pascal
Пример дублирования текстуры

Рис. 9.2. Пример дублирования текстуры

Наложение текстуры на сложные объекты

При необходимости наложения текстуры на сложный объект координаты текстуры определяются индивидуально для каждого примитива.

Ниже приведен пример наложения текстуры на сферу. Текстура как бы разбивается на прямоугольники, и каждый прямоугольник накладывается на отдельный четырехугольный примитив, из которых формируется поверхность сферы.

void sphere(double r, int nx, int ny)
{
  int i, ix, iy;
  double x, y, z;
  for (iy=0; iy < ny; ++iy)
  {
    GL.Begin(BeginMode.QuadStrip);
    for (ix = 0; ix <= nx; ++ix)
    {
      x = r * Math.Sin(iy * Math.PI / ny) * Math.Cos(2 * ix * Math.PI / nx);
      y = r * Math.Sin(iy * Math.PI / ny) * Math.Sin(2 * ix * Math.PI / nx);
      z = r * Math.Cos(iy * Math.PI / ny);
      //нормаль направлена от центра
      GL.Normal3(x, y, z);
      GL.TexCoord2((double)ix / (double)nx, (double)iy / (double)ny);
      GL.Vertex3(x, y, z);
  x = r * Math.Sin((iy + 1) * Math.PI / ny) * 
    Math.Cos(2 * ix * Math.PI / nx);
      y = r * Math.Sin((iy + 1) * Math.PI / ny) * 
        Math.Sin(2 * ix * Math.PI / nx);
      z = r * Math.Cos((iy + 1) * Math.PI / ny);
      GL.Normal3(x, y, z);
      GL.TexCoord2((double)ix / (double)nx, (double)(iy + 1) / (double)ny);
      GL.Vertex3(x, y, z);
    }
    GL.End();
  }
}
Листинг 9.10. Пример наложения текстуры на поверхность сферы на C# с использованием библиотеки OpenTK
procedure sphere(r: GLFloat; nx, ny: integer);
var 
  i, ix, iy: integer;
  x, y, z: GLFloat;
begin
  for iy:=0 to ny-1 do begin
    glBegin(GL_QUAD_STRIP);
    for ix:=0 to nx do begin
      x:= r*sin (iy*pi/ny)*cos(2*ix*pi/nx);
      y:=r * sin (iy*pi/ny)*sin(2*ix*pi/nx);
      z:= r* cos(iy*pi/ny);
      glNormal3f(x, y, z);
      glTexCoord2f(ix/nx, iy/ny);
      glVertex3f(x, y, z);
      x:= r*sin ((iy+1)*pi/ny)*cos(2*ix*pi/nx);
      y:=r * sin ((iy+1)*pi/ny)*sin(2*ix*pi/nx);
      z:= r* cos((iy+1)*pi/ny);
      glNormal3f(x, y, z);
      glTexCoord2f(ix/nx, (iy+1)/ny);
      glVertex3f(x, y, z);
    end;
    glEnd;
  end;
end;
Листинг 9.11. Пример наложения текстуры на поверхность сферы на Object Pascal

Методу класса sphere на C# и процедуре sphere на Object Pascal передаются три параметра:

  • r – радиус сферы;
  • nx и ny – количество окружностей параллельных плоскостям YX и XZ, которые используются для формирования изображения поверхности сферы.
Пример наложения текстуры на сферу

Рис. 9.3. Пример наложения текстуры на сферу

Краткие итоги

В OpenGL реализована поддержка нескольких типов текстур: линейных, поверхностных (двухмерных) и объемных (трехмерных) текстур.

На практике часто используются двухмерные (поверхностные) тектуры. Этот тип текстур имеет две координаты s и t. Изображение для текстуры может быть сформировано программно или загружено из графического файла, например, формата BMP.

Привязка текстуры к вершинам примитива выполняется с помощью команды TexCoord2. Для инициализации текстуры используется команда TexImage2D. Для отображения тектуры должны быть так же заданы алгоритмы масштабирования текстуры с помощью команды TexParameter. Отображение тектуры может быть включено и выключено при формировании примитивов с помощью команд Enable и Disable.

< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?