Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Інститут комп’ютерних технологій автоматики та метрології
Кафедра БІТ
Звіт
до лабораторної роботи № 6
з дисципліни :
“ Програмування комп’ютерної графіки ”
Львів 2012
Мета: Знайомство з можливостями бібліотеки OPENGL для завдання параметрів освітлення сцени; аналіз різних варіантів освітлення.
КОРОТКІ ТЕОРЕТИЧНІ ДАНІ
OPENGL обчислює колір кожного пікселя в результуючій, сцені, що відображується, міститься в буфері кадру. Частка цього розрахунку залежить від того, яке освітлення використовується в сцені, і як об'єкти сцени відображають і поглинають світло. Як приклад цьому пригадаєте, що океан (або море, або річка – взагалі кажучи, будь-яке водоймище) має різний колір в сонячний або в хмарний день. Присутність світла або хмар визначає, чи буде вода виглядати яскраво сині або брудно зеленою. По правді кажучи, більшість об'єктів взагалі не виглядають тривимірними, якщо вони не освітлені. Скажімо, неосвітлена сфера нічим не відрізняється від двовимірного круга. Освітлення будь-якого об'єкту залежить від двох чинників. Перший - це матеріал, з якого зроблений об'єкт. Другий - це світло, яким він освітлений.
Модель освітлення.
OPENGL розраховує світло і освітлення так, як ніби світло може бути роздільний на червоний, зелений і синій компоненти. Таким чином, джерело світла характеризується кількістю червоного, зеленого і синього світла, яку він випромінює, а матеріал поверхні характеризується долями червоного, зеленого і синього компонентів, які він відображає в різних напрямах. Рівняння освітленості в OPENGL є всього лише апроксимаціями, та зате вони працюють досить добре і можуть бути обчислені відносно швидко.
У моделі освітлення OPENGL світло виходить від декількох джерел, які можуть включатися і вимикатися індивідуально. Частина світу зазвичай виходить з якого-небудь певного напряму або позиції, частка розподілена по всій сцені. Наприклад, якщо ви включите лампочку в кімнаті, велика частина світу виходитиме від неї, але частина світу падає на поверхні предметів в кімнаті після того, як він відбився від однієї, два, три або більш за стени. Вважається, що це багато разів відбите світло (званий фоновим світлом) розподілене настільки сильно, що не існує ніякого способу визначити його початковий напрям, проте він зникає при виключенні певного джерела світла.
Нарешті, в сцені може бути також присутнім загальне фонове світло, у якого немає ніякого конкретного джерела, неначе він був відбитий стільки раз і розподілений так сильно, що його оригінальне джерело встановити неможливо.
У моделі OPENGL ефект від джерела світла присутній тільки якщо є поверхні що поглинають або відображають світло. Вважається, що кожна поверхня складається з матеріалу з декількома властивостями. Матеріал може випромінювати своє власне світло (наприклад, фара автомобіля), він може розподіляти деяку кількість вхідного світла на всіх напрямках, також він може відображати частину світу в певному напрямі (наприклад, дзеркало або інша блискуча поверхня).
У моделі освітлення OPENGL передбачається, що освітлення може бути розділене на 4 компоненти: фонове (ambient), дифузне (diffuse), дзеркальне (specular) і витікаюче (емісійне – emissive). Все 4 компоненти розраховуються незалежно і тільки тоді підсумовуються.
Фонове, дифузне, дзеркальне і витікаюче світло.
Фонове випромінювання – це світло, яке настільки розподілене середою (предметами, стінами і так далі), що його напрям визначити неможливо – здається, що він виходитиме звідусіль. Лампа денного світла має великий фоновий компонент, оскільки велика частина світу, досягаючого вашого ока, спочатку відбивається від безлічі поверхонь. Вуличний ліхтар має маленький фоновий компонент: велика частина його світу йде в одному напрямі, крім того, оскільки він знаходиться на вулиці, дуже невелика частина світу потрапляє вам в око після того, як відіб'ється від інших об'єктів. Коли фонове світло падає на поверхню, він однаково розподіляється на всіх напрямках.
Дифузний компонент – це світло, що йде з одного напряму, таким чином, він виглядає яскравішим, якщо падає на поверхню під прямим кутом, і виглядає тьмяним, якщо стосується її всього лише побіжно. Проте, коли він падає на поверхню, він розподіляється однаково на всіх напрямках, тобто його яскравість однакова незалежно від того, з якого боку ви дивитеся на поверхню. Ймовірно, будь-яке світло, витікаюче з певного напряму або позиції, має дифузний компонент.
Дзеркальне світло виходить з певного напряму і відбивається від поверхні в певному напрямі. При віддзеркаленні добре сфокусованого лазерного променя від якісного дзеркала походить майже 100 процентне дзеркальне відзеркалення. Блискучий метав або пластик має високий дзеркальний компонент, а шматок килима або плюшева іграшка – ні. Ви можете думати про дзеркальність як про те, наскільки блискучим виглядає матеріал.
Окрім фонового, дифузного і дзеркального кольорів, матеріали можуть також мати витікаючий колір, що імітує світло, витікаюче від самого об'єкту. У моделі освітлення OpenGLвихідне світло поверхні додає об'єкту інтенсивності, але на нього не впливають ніякі джерела світла, і він не проводить додаткового світла для сцени в цілому.
Хоча джерело світла випромінює єдиний розподіл частот, фоновий, дифузний і дзеркальний компоненти можуть бути різні. Наприклад, якщо у вашій кімнаті червоні стіни і білий світ, то це світло, відбиваючись від стенів буде швидше червоним, чим білим (не дивлячись на те, що падаюче на стіну світло – білий). OPENGL дозволяє встановлювати значення червоного, зеленого і синього незалежно для кожного компоненту світла.
Хід роботи:
Завдання 1. Будую 2 сфери з координатами і радіусом, заданими в таблиці 1.
Завдання 2. Задаю фонове освітлення з параметрами, заданими в таблиці 1.
Завдання 3. Задаю параметри матеріалу для сфер. Одна з сфер повинна мати властивість GL_DIFFUSE, а друга GL_SHININESS. Колір і ступінь блиску задані в таблиці 1.
Завдання 4. Створюю джерела світла. Параметри джерел світла задаються довільно, проте вони мають бути різні для різних ламп.
Варіанти до завдань лабораторної роботи.
№
Координати центру сфери
Радіус сфери
Параметри фонового освітлення
Колір, ступінь блиску
К-ть ламп
2
2,7,9
5
0.1,0.4,0.1,1
синій, 79
3
Текст програми:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// для работи з бібліотекою OpenGL
using Tao.OpenGl;
// для работи з бібліотекою FreeGLUT
using Tao.FreeGlut;
// для работи з елементом управління SimpleOpenGLControl
using Tao.Platform.Windows;
namespace lab6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация библиотеки GLUT
Glut.glutInit();
// инициализация режима окна
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
// устанавливаем цвет очистки окна
Gl.glClearColor(255, 255, 255, 1);
// установка порта вывода в соотвествии с размерами элемента anT
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
Gl.glOrtho(-20, 20, -20, 20, -20, 20);
// настройка проекции
// Gl.glMatrixMode(Gl.GL_PROJECTION);
// Gl.glLoadIdentity();
// Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 2, 200);
// Gl.glMatrixMode(Gl.GL_MODELVIEW);
// Gl.glLoadIdentity();
Gl.glColor3f(0, 0, 0);
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_AMBIENT,1f);
// настройка параметров OpenGL для визуализации
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
float[]ambient = new float[] {0.5f, 0.5f, 0.5f, 1};
Gl.glLightModelfv(Gl.GL_LIGHT_MODEL_AMBIENT, ambient);
}
private void AnT_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glColor3f(0, 0, 1);
float[] pos = new float[] {-5,-5,-5,5 };
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, pos);
Gl.glPushMatrix();
Gl.glTranslated(2, 7, 9);
Gl.glRotated(45, 1, 1, 0);
float [] aaa = new float [] {1,0,0};
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, aaa);
// рисуем сферу с помощью библиотеки FreeGLUT
Glut.glutSolidSphere(5, 20, 20);
Gl.glTranslated(-2, -7, -9);
Gl.glRotated(45, 1, 1, 0);
float[] bbb = new float[] { 100 };
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, bbb);
// рисуем сферу с помощью библиотеки FreeGLUT
Gl.glColor3f(0, 1, 1);
Glut.glutSolidSphere(2, 20, 20);
Gl.glPopMatrix();
Gl.glFlush();
AnT.Invalidate();
}
}
}
Висновок: На даній лабораторній роботі я ознайомився з можливостями бібліотеки OPENGL для завдання параметрів освітлення сцени; проаналізував різні варіанти освітлення.