Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
комп графика Лекции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
200.48 Кб
Скачать

Подготовка текстуры из bmp файла, для случая, когда размеры файла известны

procedure TfrmGL.BmpTexture(name:string); // name –имя файла

var

i, j,i1,i2: Integer;

begin

bitmap := TBitmap.Create;

try

bitmap.LoadFromFile(name); // загрузка текстуры из файла

{--- заполнение битового массива ---}

For i := 0 to 127 do // 127 размер текстуры по х

For j := 0 to 127 do //127 размер текстуры по y

begin

bits [i, j, 0] := GetRValue(bitmap.Canvas.Pixels[i,j]);

bits [i, j, 1] := GetGValue(bitmap.Canvas.Pixels[i,j]);

bits [i, j, 2] := GetBValue(bitmap.Canvas.Pixels[i,j]);

end;

finally

bitmap.Free;

end;

// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameterf(GL_TEXTURE_2D, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,

128,128, // здесь задается размер текстуры 127 размер текстуры по х

0, GL_RGB, GL_UNSIGNED_BYTE, @Bits);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

// glEnable(GL_TEXTURE_2D);

end;

Пример инициализации двухмерной текстуры

{=======================================================================

Инициализация}

procedure TfrmGL.Init;

var

i, j, k : Integer;

texImage : Array [0..63, 0..63, 0..2] of GLUbyte;

begin

For i := 0 to 63 do

For j := 0 to 63 do begin

k := ((i shr 2) and 1) xor ((j shr 3) and 1);

texImage [i][j][0] := 255 * k;

texImage [i][j][1] := 255*(1 - k);

texImage [i][j][2] := 0;

end;

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexImage2D (GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, @texImage);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

// glEnable(GL_TEXTURE_2D);

end;

Лекция 6. Буфер трафарета

6.1 Тест трафарета

Многие специальные эффекты, такие как:

  • вырезание объектов;

  • отбеливание;

  • оконтуривание;

  • стерео восприятие,

реализуется с помощью теста трафарета. Наложение трафарета разрешает или блокирует рисование на пиксельном уровне.

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

Тест разрешается и блокируется командами

glEnable(GL_STENCIL_TEST);

glDisable(GL_DEPTH_TEST);

Для проведения этого тестирования предусмотрены две команды. Одна из которых (glStencilFunc) описывает, как надо проводить сравнение цвета, находящегося в буфере кадра с цветом вновь водимого объекта, а другая (glStencilOp) – что надо делать по результатам сравнения.

GlStencilFunc(

(GLenum func,

GLint ref,

Glunit mask);

func – задает функцию сравнения значений хранящихся в буфере трафарета с некоторым заданным параметром ref, но сравнение осуществляется посредством некоторой маски mask. Функция сравнения может принимать одно из следующих значений.

Константа

Тест завершается положительно

GL_NEVER

GL_LESS

GL_EQUAL

GL_LEQUAL

GL_GREATE

GL_NOTEQUAL

GL_GEQUAL

GL_ALWAYS

Никогда

Если (ref & mask) < (stencill & mask)

Если (ref & mask) = (stencill & mask)

Если (ref & mask)  (stencill & mask)

Если (ref & mask) > (stencill & mask)

Если (ref & mask)  (stencill & mask)

Если (ref & mask)  (stencill & mask)

Всегда

Параметр ref задает число для тестирования трафарета и может принимать любое значение из диапазона [0-2n-1], где n – разрядность буфера трафарета. Параметр mask задает маску.

Если тест принимает значение true, то цветом вновь водимого объекта записывается в буфер кадра.

По результатам тестирования, выполняемых функцией GlStencilFunc,

функция glStencilOp для каждого пикселя в буфере трафарета выполняет следующие действия

glStencilOp(

GLenum fail, - имя действия, для случая, если тест трафарета fail;

GLenum zfail, - имя действия, если тест трафарета true, а z тест fail;

GLenum zpass); - имя действия, если тест трафарета true, и z тест true;

Действия, выполняемее для каждого из трех (fail, zfail, zfail) случаев, приведены следующей таблице

Имя действия

Дйствия

GL_KEEP

GL_ZERO

GL_REPLACE

GL_INCR

GL_DECR

GL_INVERT

Сохранить текущие значение в буфере трафарета;

Установить значение в буфере трафарета равным 0;

Установить значение в буфере трафарета равным ref;

Увеличить значение в буфере трафарета до 2n-1;

Уменьшить значение в буфере трафарета до 0;

Поразрядно инвертировать содержимое буфера трафарета;

Например, программа создания прямоугольного выреза в круге.

В процедуре создание окна

procedure TfrmGL.FormCreate(Sender: TObject);

begin

….

GlClearStencil($1); // чистим буфер трафарета, для фона кадра

GlStencilMask($FF); // определяем значение маски трафарета

end;

В процедуре перерисовки сцены

….

glEnable(GL_STENCIL_TEST); // инициализируем функцию трафарета

// При рисовании квадрата в буфер трафарета заносим 3=00000011

glPushMatrix;

gluQuadricDrawStyle (quadObj, GLU_FILL);

glColor3f (1.0, 0.0, 0.0);

// ref mask

glStencilFunc(GL_never, $03, $FF); // Тест не выполняется – квадрат не отображается

glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);//в буфер трафарета заносится $03

glBegin(GL_QUADS); //определяем область квадратного отверстие

glNormal3f(0.0, 0.0, 1.0);

glVertex3f(-1.0, -1.0, 0.0);

glVertex3f(1.0, -1.0, 0.0);

glVertex3f(1.0, 1.0, 0.0);

glVertex3f(-1.0, 1.0, 0.0);

glEnd;

glPopMatrix;

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

// отличное от $03, например$02.

// ref mask

glStencilFunc(GL_NOTEQUAL, $03, $FF);

glStencilOp(GL_ZERO, GL_KEEP,GL_KEEP);

gluDisk (quadObj, 0.0, 1.0, 20, 20);

// Прорисовка круга осуществляется только там, где в буфере трафарета нет $03