Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР9.doc
Скачиваний:
1
Добавлен:
09.07.2019
Размер:
92.16 Кб
Скачать

Лабораторна робота № 11

Растровий блок. Завдання закону зміни контрасту (туман) і перевірка умов приміщення крапки в буфер кадру (тести).

Метою даної роботи є вивчення основ створення туману в трьохвимірних сценах на мові програмування високого рівня.

Технічне і програмне забезпечення:

Створення моделі здійснюється інтегрованому програмному середовищі MS Visual C++ 6.0.

Короткі теоретичні відомості:

Всі об'єкти реального світу поділяються на:

- об'єкти, що відбивають світло;

- джерела світла;

- середовище.

Всі об'єкти, що беруть участь у процесі моделювання в цей момент поєднуються поняттям «сцена».

Середовище. Завдання закону зміни контрасту.

Представляється спрощено. Із усього різноманіття взаємодій світла при поширенні в середовищі враховується тільки закон зміни контрасту не самосвітних об'єктів як функція далекості. При цьому колір об'єктів наближається до кольору туману зі збільшенням далекості.

При дальності видимості більше 2км як правило має місце лінійний закон зміни контрасту (“димку”, “повітряна перспектива”), а при дальності видимості менш 1км - експонентний закон (“туман”).

Можливе завдання лінійного (GL_LINEAR), експонентного (GL_EXP), експонентного у квадраті (GL_EXP2) закони зміни контрасту як функції дальності. Завдання типу закону здійснюється функцією glFogi(GL_FOG_MODE, < тип закону >).

Для першого випадку задаються відстані від спостерігача уздовж осі Z до початку області затуманення glFogf(GL_FOG_START, <z>) і до області з нульовим контрастом glFogf(GL_FOG_END, <z>). Для двох останніх законів задається коефіцієнт щільності туману glFogf(GL_FOG_DENSITY, <щільність туману 0..1>).

Крім того задається колір туману, до якого буде наближатися колір об'єктів glFogfv(GL_FOG_COLOR, < покажчик на RGBA вектор >) і тип алгоритму розрахунку:

- верховий glHint(GL_FOG_HINT, GL_FASTEST);

- попіксельний glHint(GL_FOG_HINT, GL_NICEST);

- визначається прискорювачем glHint(GL_FOG_HINT, GL_DONT_CARE).

Розрахунок «затуманення» може бути дозволений або заборонений - функції glEnable/glDisable з параметром GL_FOG.

Зауваження 1: Завдання типу алгоритму можливо також для:

- перспективно коректних алгоритмів: GL_PERSPECTIVE_CORRECTION_HINT;

- алгоритму згладжування крапок: GL_POINT_SMOOTH_HINT;

- алгоритму згладжування ліній: GL_LINE_SMOOTH_HINT;

- алгоритму згладжування країв полігонів: GL_POLYGON_SMOOTH_HINT;

- алгоритму розрахунку освітленості: GL_PHONG_HINT.

Зауваження 2: Реальні закони поглинання, розсіювання й переломлення світла не враховуються.

Зауваження 3: Як і у випадку розрахунку освітленості, розрахунок зміни контрасту може вироблятися як для вершин примітивів з наступною інтерполяцією, так і для кожної крапки зображення – верховий і попіксельний алгоритм розрахунку туману.

Перевірка умов приміщення крапки в буфер кадру (тести).

Тест приналежності – перевірка приналежності крапки контексту відтворення (проходить, якщо контекст відтворення OpenGL активний).

Тест відсікання. Визначає, чи належить крапка заданої області у вікні виводу. Повний розмір області виводу (розмір вікна) задається викликом функції glViewport(x, y, width, height). У межах цієї області можна задати під область, доступну для відображення в цей момент - функція glScissor(x, y, width, height), де x, y - координати лівої нижньої крапки області, width, height - розміри області (крапок). Тест може бути дозволений і заборонений - функції glEnable/glDisable з параметром GL_SCISSOR_TEST.

Тест прозорості. Визначає, чи належить прозорість крапки заданому діапазону. Якщо так - крапка міститься в буфер кадру, інакше відкидається. Діапазон значень і закон задається функцією glAlphaFunc(<закон>,<значення прозорості для порівняння>). Параметр <закон> може приймати наступні значення:

Ім'я макровизначення

Тест завершується позитивно, якщо

GL_NEVER

Ніколи

GL_LESS

Отримане значення менше посилального

GL_EQUAL

Отримане значення дорівнює посилальному

GL_LEQUAL

Отримане значення менше або дорівнює посилальному

GL_GREATER

Отримане значення більше посилального

GL_NOTEQUAL

Отримане значення нерівно посилальному

GL_GEQUAL

Отримане значення більше або дорівнює посилальному

GL_ALWAYS

Завжди. Установлено за замовчуванням

Тест може бути дозволений або заборонений - функції glEnable/glDisable з параметром GL_ALPHA_TEST.

Тест глибини. Порівнює далекість до вступник крапки (значення z-координати) з далекістю до відповідної крапки (значення в z-буфері), збереженої в буфері кадру. Якщо різниця відповідає заданому закону, то крапка міститься в буфер кадру, інакше відкидається. Закон задається функцією glDepthFunc(<закон>). Параметр <закон> може приймати наступні значення:

Ім'я макровизначення

Тест завершується позитивно, якщо

GL_NEVER

Ніколи

GL_LESS

Отримане значення z-координати менше зберігається в буфері. Установлено за замовчуванням

GL_EQUAL

Отримане значення z-координати дорівнює тому, що зберігається в буфері

GL_LEQUAL

Отримане значення z-координати менше або дорівнює тому, що зберігається в буфері

GL_GREATER

Отримане значення z-координати більше зберігається в буфері

GL_NOTEQUAL

Отримане значення z-координати нерівно зберігається в буфері

GL_GEQUAL

Отримане значення z-координати більше або дорівнює тому, що зберігається в буфері

GL_ALWAYS

Завжди.

Тест може бути дозволений або заборонений - функції glEnable/glDisable з параметром GL_DEPTH_TEST. На кожну екранну крапку доводиться одна група осередків в z-буфері. Дозвіл апаратного z-буфера як правило становить 16, 24, 32 біта.

Тест трафарету. Ґрунтується на буфері трафарету, просторовий дозвіл якого відповідає просторовому дозволу буферів кадру й глибини, тобто на кожну екранну крапку доводиться одна група осередків буфера трафарету. Якщо доступно апаратний буфер трафарету, то його розрядність становить 1 або 8 біт. Вхідними параметрами тесту є:

- закон порівняння;

- значення, з яким здійснюється порівняння вмісту буфера трафарету;

- маска, що визначає для яких бітових площин буфера буде здійснюватися порівняння.

Для завдання закону й параметрів порівняння використовується функція glStencilFunc(<закон>, <значення для порівняння>, <маска>). Параметр <закон> може приймати наступні значення:

Ім'я макровизначення

Тест завершується позитивно, якщо

GL_NEVER

Ніколи

GL_LESS

Якщо (ref & mask) < (stencil & mask)

GL_EQUAL

Якщо (ref & mask) = (stencil & mask)

GL_LEQUAL

Якщо (ref & mask) ≤ (stencil & mask)

GL_GREATER

Якщо (ref & mask) > (stencil & mask)

GL_NOTEQUAL

Якщо (ref & mask) ≠ (stencil & mask)

GL_GEQUAL

Якщо (ref & mask) ≥ (stencil & mask)

GL_ALWAYS

Завжди.

Тест може бути дозволений або заборонений - функції glEnable/glDisable з параметром GL_STENCIL_TEST.

Тест трафарету звичайно використовується в багатопрохідних алгоритмах, що вимагає нагромадження інформації в буферах кадру, глибини й трафарету, а також взаємного впливу між результатами окремих проходів. Параметри заповнення буфера трафарету при кожному проході задаються функцією glStencilOp(fail, zfail, zpass). Перший параметр задає закон заповнення при неуспішному тесті трафарету, а другий і третій - при успішному тесті трафарету й неуспішному/успішному тесті глибини відповідно. Закони заповнення:

Ім'я макровизначення

Тест завершується позитивно, якщо

GL_ZERO

Установити значення буфера трафарету в нуль

GL_KEEP

Зберегти поточне значення в буфері

GL_REPLACE

Установити значення буфера трафарету в значення ref функцією glStencilFunc

GL_INCR

Якщо не максимальне значення, то збільшити значення в буфері трафарету

GL_DECR

Якщо не 0, то зменшити значення в буфері трафарету

GL_INVERT

Порозрядно інвертувати поточне значення

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]