Лабораторна робота № 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 |
Порозрядно інвертувати поточне значення |