Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Текстура
Координаты текстуры
Задание координат текстуры позволяет сопоставить вершины примитивов с изображением текстуры. Вне зависимости от размера изображения текстуры в пикселах, координаты текстуры определяются библиотекой 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).
Если необходимо, чтобы изображение дублировалось при наложении на примитив по горизонтали и/или вертикали, то в этом случае при задании координат текстуры необходимо указать значение больше 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
Наложение текстуры на сложные объекты
При необходимости наложения текстуры на сложный объект координаты текстуры определяются индивидуально для каждого примитива.
Ниже приведен пример наложения текстуры на сферу. Текстура как бы разбивается на прямоугольники, и каждый прямоугольник накладывается на отдельный четырехугольный примитив, из которых формируется поверхность сферы.
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, которые используются для формирования изображения поверхности сферы.
Краткие итоги
В OpenGL реализована поддержка нескольких типов текстур: линейных, поверхностных (двухмерных) и объемных (трехмерных) текстур.
На практике часто используются двухмерные (поверхностные) тектуры. Этот тип текстур имеет две координаты s и t. Изображение для текстуры может быть сформировано программно или загружено из графического файла, например, формата BMP.
Привязка текстуры к вершинам примитива выполняется с помощью команды TexCoord2. Для инициализации текстуры используется команда TexImage2D. Для отображения тектуры должны быть так же заданы алгоритмы масштабирования текстуры с помощью команды TexParameter. Отображение тектуры может быть включено и выключено при формировании примитивов с помощью команд Enable и Disable.