OpenGL в Delphi

       

Пример использования одномерной текстуры




Всплывающее меню приложения содержит пункты, позволяющие менять ширину полосок, выбирать тип объекта из трех базовых, а также управлять одним из параметров текстуры - генерацией координаты s.
В пользовательской процедуре MakeTeximage подготавливается массив образа текстуры, а также задаются все связанные с ней параметры:

var
TexWidth : GLint =16; // ширина текстуры
GenSOn : Boolean = True; // генерировать ли координату s
// параметром процедуры является требуемая ширина текстуры,
// число должно быть степенью двойки
procedure MakeTeximage (TexImageWidth : GLint);
const // параметры текстуры
TexParams : Array [0..3] of GLfloat = (0.0, 0.0, 1.0, 0.0);
var
Texlmage : Array [0..128 * 3] of GLUbyte; // массив текстуры
3 : GLint; // вспомогательная переменная begin
3 := 0; // чередование красной и синей полосок
While ] < TexImageWidth * 3 - 1 do begin // заполнение массива образа
Texlmage [j] := 255; // красный
Texlmage [3 + 1] := 0; // зеленый
Texlmage [3 + 2] := 0; // синий
Texlmage [3 + 3] := 0; // красный
Texlmage [j + 4] := 0; // зеленый
Texlmage [: + 6] := 255; // синий
lnс (j, 6) ;
end;
// эти команды должны вызываться обязательно
glTexParameter (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameter (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL~NEAREST) ,'
// собственно создание текстуры
glTexImagelD (GL_TEXTURE_1D, 0, 3, TexImageWidth, 0, GL_RGB,
GL_UNSIGNED_BYTE, STexImage); // генерировать ли координату s
If GenSOn
then glEnable (GL_TEXTURE_GEN_S'
else glDisable (GL_TEXTURE_GEN_S);
// уточняем параметры для координаты s, чтобы текстура не выглядела,
// как штриховка многоугольников
glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv (GL_S, GL_OBJECT_PLANE, @TexParams); // для поворота полосок
glEnable (GL_TEXTURE_1D); // включаем текстуру
end;

Здесь использован почти минимальный набор действий, которые необходимо выполнить, чтобы пользоваться текстурой; единственное, что можно удалить в этом коде, это строки, связанные с координатой s, но тогда пропадет возможность разворачивать полоски текстуры. Массив образа содержит значения RGB, задающие узор полосок (я задал значения для равных по ширине полосок красного и синего цвета) Команда glTexParameter позволяет задавать параметры текстуры Минимум, что надо сделать - задать значения для фильтров, как и написано в комментарии

Замечание
Если говорить точно, то первую строку можно удалить, но вторая строка должна присутствовать обязательно, даже и со значением, принятым по умолчанию.

Фильтры задают вид текстуры, когда площадь пиксела, на которую она накладывается, в одном случае больше, а в другом меньше элемента текстуры Эти значения я задал равными GL_NEAREST, что соответствует неточному расчету текстуры Другое возможное значение - GL_LINEAR, расчет будет точным, но за счет скорости. Если вы установите такое значение третьего параметра команды glTexParameter, то на границах полосок цвет будет плавно размываться.
Команда glTexImagelD вызывается каждый раз, когда надо задавать текстуру Для одномерной текстуры нужно использовать именно эту команду Ее первый параметр указывает на размерность, значение второго параметра, числа уровней детализации текстуры, никогда не меняйте и задавайте равным нулю Третий параметр задается равным трем или четырем для сохранения цвета, остальные значения приведут к потере цвета полосок. Дальше идет ширина текстуры; как видно из примера, она не обязательно должна совпадать с размером массива Пятый параметр, ширину границы, тоже рекомендую пока не трогать Шестой параметр задает формат данных, смысл остальных параметров понятен.
В общем, из всех параметров команды я рекомендую менять только ширину текстуры, ну и еще задавать имя массива
С текстурой связан набор координат, чаще всего вам потребуется работать с координатами s и t.
Группа команд glTexGen предназначена для установки функции, используемой для генерации координат текстуры Если этого не делать, то значение, задаваемое по умолчанию, приведет к тому, что текстура будет вести себя подобно штриховке, т. е не будет приклеена к поверхности В примере я взял значения аргументов команды, чаще всего используемые на практике, другие значения разберем позднее.
Для того чтобы полоски текстуры правильно разворачивались на сфере, перечисленных действий достаточно, но для цилиндра необходимо скорректировать карту расположения текстуры на объекте, в файле справки детально разбирается смысл всех параметров, связанных с координатами s и t.
Перед описанием списков вызывается команда, связанная с наложением текстуры на quadnc-объекты gluQuadricTexture (Quadric, TRUE);
Эта команда задает, генерировать ли координаты текстуры для таких объектов Если вы удалите эту строку, то при отключенной генерации координаты s текстуры quadnc-объекты (сфера и цилиндр) не будут покрыты текстурой.
Сейчас я вам советую дополнить набор объектов диском из библиотеки glu, а также многогранниками библиотеки glut и посмотреть, как текстура ложится на их поверхность
Координаты текстуры необходимо задавать для ее правильного отображения на поверхность. Введите в программу список для простого квадрата. Чтобы не было путаницы с координатами квадрата и текстуры, координаты вершин зададим отличными от 1. Для каждой вершины квадрата определяем ассоциированные вершины текстуры:

glBegin (GL_QOADS);
glTexCoord2d (0.0, 0.0); // s и t = 0
glVertex2f (-0.5, -0.5); // левый нижний угол квадрата
glTexCoord2d (1.0, 0.0); // s = 1, t = 0
glVertex2f (0.5, -0.5); // правый нижний
glTexCoord2d (1.0, 1.0); // s и t = 1
glVertex2f (0.5, 0.5); // правый верхний
glTexCoord2d (0.0, 1.0); // s = 0, t = 1
glVertex2f (-0.5, 0.5); // левый верхний
glEnd;

To есть для левого нижнего угла квадрата значения s и t нулевые, для правой нижней вершины значение t равно единице и т. д.
Теперь при отключенной генерации координаты s полоски правильно ложатся на квадрат. При включенном режиме значения всех элементов массива параметров должны быть нулевыми, за исключением первого. Для того чтобы перевернуть полоски, надо задавать ненулевым не первый, а второй элемент массива, если же оба их задать равными единице, полоски лягут по диагонали.
Теперь перейдем к двумерной текстуре. В проекте из подкаталога Ех82 поверхность многоугольников покрыта шашками (Рисунок 4.55).



Содержание раздела