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

Альфа компонент, задаваемый четвертым аргументом в командах задания цвета примитивов, glColor4f(red, green, blue, alpha); используется для получения смешения цветов.

Режим смешения включается командами:

glEnable (GL_BLEND); - инициализация режима смешения цветов

glDisable (GL_BLEND); - закрытие режима смешения цветов

Режим смешения цветов задается командой

glBlendFunc(sfactor, dfactor);

где sfactor и dfactor символьные константы, задающие методы обработки информации хранящейся в буфере кадра и вновь поступающей в буфер информации соответственно. Результаты обработки выполненной методом sfactor по компонентно (r,g,b) складываются с результатами обработки выполненными методом dfactor .

Методы обработки приведены в таблице, где использованы следующие обозначения:

индекс s относится к sfactor, а d относятся к dfactor .

Параметры

Метод

GL_ZERO

GL_ONE

GL_SRC_COLOR

GL_ONE_MINUS_SRC_COLOR

GL_DST_COLOR

GL_ONE_MINUS_DST_COLOR

GL_SRC_ALPHA

GL_ONE_MINUS_SRC_ ALPHA

GL_ DST_ALPHA

GL_ONE_MINUS_ DST _ ALPHA

GL_SRC_ALPHA_SATURATE

(0,0,0,0)

(1,1,1,1)

(Rs,Gs,Bs,As)

(1,1,1,1)- (Rs,Gs,Bs,As)

(Rd,Gd,Bd,Ad)

(1,1,1,1)- (Rd,Gd,Bd,Ad)

(As, As, As, As)

(1-As), (1-As), (1-As)

(Ad, Ad, Ad, Ad)

(1-Ad), (1-Ad), (1-Ad)

(i,i,i,i), где i=min(As,1-Ad)

Результирующий цвет пикселя

Rd=min(1,Rs*sr+Rd*dr);

Gd=min(1,Gs*sg+Gd*dg);

Rd=min(1,Bs*sb+Bd*db);

Rd=min(1,As*sa+Ad*da);

Где sr, sg, bg- цвет sfactor, а dr, dg, dg- цвет dfactor .

Для реализации прозрачности следует использовать команду glBlendFunc со следующими параметрами:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Чем меньше As тем прозрачнее объект.

4.5 Задание теста глубины

Тест глубины включается: glEnable(GL_DEPTH_TEST);

выключается: glDisable(GL_DEPTH_TEST);

Разрешить работу с буфером глубины: glDepthMask(true);

Запретить работу с буфером глубины glDepthMask(false);

Режим сравнения глубины задается командой glDepthFunc(Glenum func);

Где func может принимать значения:

GL_NEVER никогда

GL_LESS Zтек<Zбуф. по умолчанию.

GL_EQUAL Zтек=Zбуф

GL_LEQUAL Zтек<=Zбуф

GL_GREATER Zтек>Zбуф

GL_NOTEQUAL ZтекZбуф

GL_GEQUAL ZтекZбуф

GL_ALWAYS. всегда

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

Текстурой называется детализация структуры поверхности. Текстура это одномерное или двухмерное изображение, имеющее ассоциированные с ним параметры, определяющие, каким образом производится наложение изображения на поверхность. Имеется два вида детализации. Первый вид – наложение заранее заданного узора на гладкую поверхность (детализация цветом). Второй вид – создание изображений неровностей поверхности (детализация фактуры). Рассмотрим только первый способ. Для наложения текстуры необходимо выполнить следующие действия:

  • получить заготовку, которую можно использовать в качестве текстуры (файл рисунка);

  • определить собственную текстуру - создать ее образ в памяти;

  • задать необходимые параметры, как самой текстуры, так и её взаимодействие с объектом, на который она накладывается.

Получение заготовки

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

Создание образа текстуры в памяти

Для создания образа текстуры в памяти можно или самим создать текстуру в массиве (одномерном или двухмерном) размером кратным 2 (например, 64 x 32) или использовать специальные команды:

gluScaleImeage() – масштабирование образа;

gluTexImeage1D() – создает одномерную текстуру в памяти;

gluTexImeage2D()– создает двухмерную текстуру в памяти.

При Масштабировании, когда результирующий образа сжимается, используется прямоугольный фильтр, а когда растягивается используется линейная интерполяция. Команда gluScaleImeage имеет следующий формат

void gluScaleImeage (

format, - формат данных пикселя; *)

Glint widthin, - ширина исходного образа;

GLint heightin, - высота исходного образа;

GLenum typein, - тип данных; *)

const void *datain, - указатель на источник;

Glint widthout, - ширина масштабируемого образа;

GLint heightout, - высота масштабируемого образа;

GLenum typeout, - тип данных; *)

void *dataout); - указатель на массив масштабируемого образа;

*)

Формат данных пикселя: GL_COLOR_INDEX, GL_STENCIL,

GL_DEPTH_COMPONENT,

GL_RGBA, …

Тип данных для data*: GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP,

GL_ UNSIGNED_SHORT, GL_ SHORT,

GL_ UNSIGNED_INT, GL_ INT, GL_ FLOAT

После того как образ подготовлен, создаем текстуру в памяти

void glTexImage1D(

GLenum target, - тип создаваемой текстуры GL_TEXTURE_1D;

GLint level, - число уровней детализации; **)

GLint components, -задает число цветовых компонентов текстуры 3 или 4;

GLsizei width, - ширина образа должна быть 2n+2*bordеr (бордюр);

GLint border, - определяет ширину границы [0.1];

GLenum format, - формат данных *)

GLenum type, - тип данных; *)

const GLvoid *pixels - указатель на образ данных в памяти, каждый байт данных рассматривается

как 8 одноразрядных элементов, расположение которых задается в

команде glPixelStore с помощью аргумента GL_UNPACK_LSB_FIRST

);

**) Число уровней детализации: 0- базовый уровень, k- уменьшенный в k раз.

void glTexImage2D(

GLenum target, - тип создаваемой текстуры GL_TEXTURE_2D;

GLint level, - число уровней детализации; **)

GLint components, -задает число цветовых компонентов текстуры 3 или 4;

GLsizei width, - ширина образа должна быть 2n+2*bordеr (бордюр);

GLsizei height, - высота образа должна быть 2n+2*bordеr;

GLint border, - определяет ширину границы =0 или 1;

GLenum format, - формат данных *)

GLenum type, - тип данных; *)

const GLvoid *pixels - указатель на образ данных в памяти, каждый байт данных рассматривается

как 8 одноразрядных элементов, расположение которых задается в команде

glPixelStore с помощью аргумента GL_UNPACK_LSB_FIRST

);