Адитивна кольорова модель RGB
Адитивна кольорова модель RGB
МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ Бердичівський політехнічний коледж КОНТРОЛЬНА РОБОТА з предмета “Комп'ютерна графіка” Виконав:студент групи Пзс-504 Горпинич О.О. Перевірив викладач: Козік В.Ю. м. Бердичів 2007 р. 1. Адитивна кольорова модель RGB Ця модель використовується для опису кольорів, які можуть бути отримані за допомогою пристроїв, що основані на принципі випромінювання. У якості основних кольорів вибрано червоний (Red), зелений (Green) та синій (Blue). Інші кольори та відтінки можуть бути отримані змішуванням певної кількості кожного з основних кольорів. Стисло історія системи RGB така. Томас Юнг (1773-1829) узяв три ліхтарі і пристосував до них червоний, зелений і синій світлофільтри. Так були отримані джерела світла відповідних кольорів. Направивши на білий екран світло цих трьох джерел, вчений одержав таке зображення (рис. 1.21). На екрані світло від джерел давало кольорові кола. У місцях перетинання кіл спостерігалося змішування кольорів. Жовтий колір давало змішування червоного й зеленого, блакитний -- суміш зеленого Й синього, пурпурний -- синього й червоного, а білий колір утворювався змішанням усіх трьох основних кольорів. Якийсь час потому, Джеме Максвелл (1831-1879) виготовив перший колориметр, за допомогою якого людина могла порівнювати монохроматичний колір і колір змішування в заданій пропорції компонентів RGB. Регулюючи яскравість кожного з компонентів, що змішуються, можна домогтися вирівнювання кольорів суміші й монохроматичного випромінювання. Це описується в такий спосіб: де r, g і Ь -- кількості відповідних основних кольорів. Співвідношення коефіцієнтів r, g i b Максвелл наочно показав за допомогою трикутника, згодом названого його ім'ям [1]. Трикутник Максвелла є рівнобічним, у його вершинах розташовуються основні кольори -- R, G І В (рис. 1.22). Із заданої точки проводяться лінії, перпендикулярні сторонам трикутника. Довжина кожної лінії й показує відповідну величину коефіцієнта r, g чи Ь. Однакові значення r = g = Ь мають місце в центрі трикутника і відповідають білому кольору. Слід також зазначити, що деякі кольори відображаються точками зовні трикутника RGB -- це означає від'ємне значення відповідного колірного коефіцієнта. Сума коефіцієнтів дорівнює висоті трикутника, а при висоті, що дорівнює одиниці, r + g + b = 1. Як основні кольори, Максвелл використовував випромінювання з такими довжинами хвиль: 630, 528 і 457 нм. До теперішнього часу система RGB є офіційним стандартом. Рішенням Міжнародної Комісії з Освітлення -- МКО (СІЕ -- Commision International de VEclairage) у 1931 році були стандартизовані основні кольори, які було рекомендовано використовувати в якості R, G і В. Це монохроматичні кольори світлового випромінювання з довжинами хвиль відповідно: R -- 700 нм, G -- 546.1 нм, В -- 435.8 нм. Червоний колір виходить за допомогою лампи розжарювання з фільтром. Для одержання чистих зелених і синіх кольорів використовується ртутна лампа. Також стандартизоване значення світлового потоку для кожного основного кольору [1]. Ще одним важливим параметром для системи RGB є колір, одержаний після змішування трьох компонентів у рівних кількостях. Це білий колір. Виявляється, для того, щоб змішуванням компонентів R, G і В одержати білий колір, яскравості відповідних джерел не повинні бути рівними, а знаходитися у пропорції Якщо розрахунки кольору робляться для джерел випромінювання з однаковою яскравістю, то зазначене співвідношення яскравостей можна врахувати відповідними масштабними коефіцієнтами [14]. Тепер розглянемо інші аспекти. Колір, створюваний змішуванням трьох основних компонентів, можна представити вектором у тривимірній системі координат R, G і В, зображеній на рис. 1.23. Чорному кольору відповідає центр координат -- точка (0, 0, 0). Білий колір виражено максимальним значенням компонентів. Нехай це максимальне значення уздовж кожної осі дорівнює одиниці. Тоді білий колір -- це вектор (1, 1, 1). Точки, що лежать на діагоналі куба від чорного до білого, мають однакові значення координат: Ri= Gi= Bi. Це градації сірого -- їх можна вважати білим кольором різної яскравості. Узагалі говорячи, якщо усі компоненти вектора (r, g, b) помножити на однаковий коефіцієнт (k = 0 ... 1 ... 1), то колір (kr, kg, kb) зберігається, змінюється тільки яскравість. Тому для аналізу кольору важливе співвідношення компонентів. Якщо в колірному рівнянні розділити коефіцієнти r, g i b на їхню суму: Це рівняння репрезентує вектори кольору (r', g', b'), що лежать в одиничнiй площині r' + g' + b' = 1. Іншими словами, ми перейшли від куба до трикутника Максвелла. У ході колориметричних експериментів були визначені коефіцієнти (r', g', b'), що відповідають чистим монохроматичним кольорам. Найпростіший колориметр --це призма з білого гіпсу, грані якої освітлюють джерелами світла. На ліву грань спрямоване джерело чистого монохроматичного випромінювання, а права грань освітлюється сумішшю трьох джерел RGB. Спостерігач бачить одночасно дві грані, що дозволяє фіксувати рівність кольорів (рис. 1.24). Результати експериментів можна зобразити графічно (рис. 1.25). Як бачимо, коефіцієнти r', g' і b' можуть бути і позитивними, і від'ємними. Що це означає? Те, що деякі монохроматичні кольори не можуть бути представлені сумою компонентів R, G і B. Але як відняти те, чого немає? Для вирівнювання кольору довелося додати до монохроматичного випромінювання один з компонентів R, G чи В. Наприклад, якщо монохроматичне випромінювання для деякого значення розбавлялося червоним, те це можна виразити так: Як виявилося, жоден колір монохроматичного випромінювання (за винятком самих кольорів R, G і В) не може бути представлений тільки позитивними значеннями коефіцієнтів змішування. Це наочно можна зобразити за допомогою колірного графіка, побудованого на основі трикутника Максвелла (рис. 1.26). Верхня частина кривої лінії відповідає чистим монохроматичним кольорам, а нижня лінія -- від 380 нм до 780 нм -- представляє так називані пурпурні кольори (суміш синього й червоного), які не є монохроматичними. Точки, що лежать усередині контуру кривої, відповідають реальним кольорам, а поза цим контуром -- нереальним кольорам. Точки усередині трикутника відповідають позитивним значенням коефіцієнтів r', g' та b' і представляють кольори, які можна одержати змішуванням компонентів RGB. Таким чином, система RGB має неповне колірне охоплення -- деякі насичені кольори не можуть бути представлені сумішшю зазначених трьох компонентів. У першу чергу, це кольори від зеленого до синього, включаючи усі відтінки блакитного -- вони відповідають лівій частині кривої колірного графіка. Ще раз підкреслимо, що мова тут іде про насичені кольори, оскільки, наприклад, ненасичені блакитні кольори змішуванням компонент RGB одержати можна. Незважаючи на неповне охоплення, система RGB широко використовується в даний час -- у першу чергу, в кольорових телевізорах і дисплеях комп'ютерів. Відсутність деяких відтінків кольору не надто помітна. Ще одним фактором, що сприяє популярності системи RGB, є її наочність -- основні кольори знаходяться в трьох чітко помітних ділянках видимого спектра. Крім того, однією з гіпотез, що пояснюють колірний зір людини, є трикомпонентна теорія, яка стверджує, що в зоровій системі людини є три типи світлочутливих елементів. Один тип елементів реагує на зелений, інший тип -- на червоний, а третій тип -- на синій колір. Така гіпотеза висловлювалася ще Ломоносовим [14], її обґрунтуванням займалися багато вчених, починаючи з Т. Юнга. Утім, трикомпонентна теорія не є єдиною теорією колірного зору людини. 2. Об'ємні об'єкти, Tess-, NURBS - об'єкти бібліотеки Opengl В OpenGL передбачені деякі стандартні, найчастіше використовувані тривимірні об'єкти. Набір таких форм представлений у бібліотеці GLU (Utility Library), що реалізована у вигляді модуля glu32.dll й є невід'ємною частиною OpenGL. Вона містить у собі кілька функцій керування проекціями (одну з яких -- gluPerspective -- ми вже використовували), функції роботи з полігонами, кривими та поверхнями типу B-сплайнів й інші функції. Розглянемо функції gluCylinder, gluSphere, gluDisk І gluPartialDisk . Перераховані вище об'єкти названі "quadric objects". Параметри slices і stacks визначають кількість плоских граней, використовуваних для апроксимації поверхні. Для того щоб нарисувати подібний об'єкт, потрібно викликати функцію gluNewQuadric, а після рисування звільнити пам'ять викликом функції gluDeleteQuadric За умовчанням кожен об'єкт рисується із суцільним заповненням. Змінити стиль показу можна викликом функції gluQuadricDrawStyle. Можна задати такі стилі показу: у вигляді точок, розташованих на вершинах багатокутника; каркасне зображення; суцільне заповнення й силует (різновид каркасного). Наприклад, виклик. Об'єкти даного типу розташовуються у просторі в центрі координат (0, 0, 0) з врахуванням матриці gl_modelview. Тому, щоб нарисувати зображення об'єкта в необхідному місці, потрібно відповідним чином змінити цю матрицю, наприклад, за допомогою функцій glTranslate і glRotate. Нижченаведений приклад ілюструє показ об'єктів типу "quadric objects ". Зображення, що створюється програмою Studex55, наведене на рис. 11.16. При підготовці цього рисунка до друку був змінений колір тла на білий. Однак на екрані монітора значно краще виглядає темно-синій колір. У тексті програми: Для текстур використовуються растри. Вони можуть бути одномірними чи двовимірними. Щоб накласти текстуру, необхідно виконати наступні операції. 1. Відкрити в пам'яті масив, у якому буде зберігатися растр текстури. Число байтів масиву розраховується, виходячи з кількості бітів на піксел текстури. Розміри растру текстури обов'язково повинні дорівнювати ступеню двійки (плюс трохи пікселів на бордюр). Ця вимога створює деякі незручності для програміста, особливо у випадку, коли текстура читається з довільного растрового файлу. Утім, це не є нерозв'язною проблемою -- будь-який растр текстури можна або обрізати, або розтягнути (стиснути) до необхідних розмірів. 2. Заповнити масив текстури. Тут варто враховувати те, в якому форматі представлений растр текстури. Якщо піксели текстури представляються у форматі RGB (24 біта на піксел), то байти в масиві повинні розташовуватися у вигляді трійок (R, G, В). Зазначимо, що в масивах DIB Windows API колірні компоненти розташовуються у зворотному порядку, тобто (В, G, R). 3. Після того як масив відкритий, передати OpenGL адресу масиву й інші його параметри. Робиться це викликом функції glTexImage2D для двовимірної текстури і glTexImage1D для одномірної. 4. Задати параметри фільтрації текстури (викликом функції glTexParameter) для якісного відображення об'єктів різних розмірів. 5. Перед безпосереднім рисуванням об'єктів встановити режим використання текстури. Робиться це викликом функції glEnable (GL_texture_2d) Для об'єктів типу "quadric objects " (куля, циліндр, диск) треба також викликати функцію 6. При виводі полігональних граней (gl_triangles, gl_quads і їм подібних) вказати відповідність текстурних координат і координат у просторі об'єктів. Зробити це можна викликом функцій із сімейства glTexCoord. Так, наприклад, функція glTexCoord2f (s, t) вказує на точку з текстурними координатами s і t. Наступний виклик функції glVertex3f <x,y,z), одночасно із завданням координат грані, також ставить у відповідність координати (s, t) координатам (х, у, z). На рис. 11.17. показаний приклад відображення координат чотирикутної грані. Можна припустити, що хазяїн цього замку вирішив вкрити плиткою стіни, щоб уберегти свою нерухомість від руйнівного впливу агресивного навколишнього середовища. Так це було чи ні, але тут ми ще раз використовували шаховий візерунок -- вже для текстури. Растр текстури генерується тут "на льоту" й зберігається в масиві pixels. Це приклад синтетичної текстури, візерунок створюється найпростішим алгоритмом. Для створення реалістичних зображень у якості текстури зазвичай використовуються цифрові фотографії. У загальному випадку текстури зручніше зберігати у файлах на диску. Це можуть бути досить складні зображення, виготовлені заздалегідь. У програмах для Windows растри можна створювати у вигляді ресурсів, які після компіляції записуються у виконувані файли, наприклад, у файли ЕХЕ. А можна використовувати й окремі файли стандартних форматів. В останньому випадку текстури зручно багаторазово редагувати. Розглянемо, як можна використовувати текстури, записані у файлах BMP. Такі файли зберігають растр у форматі DIB (Device Independent Bitmap). Формат DIB схожий на формат текстури OpenGL, однак, є деякі відмінності. Так, у DIB використовується вирівнювання рядків на границю подвійного слова. Іншими словами, кількість байтів у рядку растра завжди повинна бути кратною чотирьом -- якщо це не так, то додають зайві байти. У нашому випадку сприятливим фактором є те, що розміри текстур OpenGL повинні дорівнювати степеневі двійки. Починаючи з розмірів по горизонталі, що дорівнюють чотирьом, 24-бітні растри DIB автоматично розташовуються в пам'яті так само, як і текстури OpenGL, -- вирівнювання відсутнє. Якщо використовувати 24-бітну глибину кольору, то більш істотною відмінністю DIB від формату текстур OpenGL є порядок розташування байтів R,G і В. Для масивів текстур OpenGL повинне бути R-G-B, у той час як у DIB навпаки: B-G-R. Тому після читання файлу необхідно переставляти байти R і В. Наша наступна програма (studex57) ілюструє читання текстури з файлу BMP. Ця програма є модифікацією попередньої програми (Studex56). Зміни торкнулися функції InitMyTexture. В її тіло вбудована функція читання файлів BMP, що названа ReadTextureBMP. Крім того, тут бажано використати текстуру більшої роздільної здатності, наприклад, розмірами 256*128 -- відповідно змініть horTexture та vertTexture. Можливо, у цьому замку замало вікон і дверей. Але їх нескладно додати в текстуру за допомогою будь-якого растрового графічного редактора, чи не так? Хоча, можливо, доведеться використовувати вже декілька текстур для різних стін. Слід зазначити, що наведена вище функція ReadTextureBMP не є універсальною -- вона не розрахована на інші різновиди формату файлів BMP. Цю функцію необхідно істотно видозмінити, якщо передбачається читання, наприклад, ще й 256-кольорових растрів. Такі растри читати трохи складніше, оскільки потрібно завантажувати й установлювати палітру. Тим, хто не хоче власноруч програмувати читання файлів, можна порекомендувати використовувати функцію auxDIBImageLoad 3 бібліотеки GIAUX. 3. Засобами бібліотеки Opengl забезпечити зміну кольору створеної точки при натисненні лівої кнопки миші (рис.1) (рис. 2) unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL; type TfrmGL = class(TForm) procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormResize(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); private DC : HDC; hrc: HGLRC; ry : GLfloat; tx : GLfloat; quadObj : GLUquadricObj; end; var frmGL: TfrmGL; mode : (POINT, LINE, FILL, SILHOUETTE) = FILL; gluobj : (SPHERE, CONE, CYLINDER, DISK) = SPHERE; orientation : (OUTSIDE, INSIDE) = OUTSIDE; normals : (NONE, FLAT, SMOOTH) = SMOOTH; implementation {$R *.DFM} procedure TfrmGL.FormPaint(Sender: TObject); begin glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета glPushMatrix; glRotatef (ry, 0.0, 1.0, 0.0); glTranslatef (tx, 0.0, 0.0); case mode of POINT : gluQuadricDrawStyle (quadObj, GLU_POINT); LINE : gluQuadricDrawStyle (quadObj, GLU_LINE); FILL : gluQuadricDrawStyle (quadObj, GLU_FILL); SILHOUETTE : gluQuadricDrawStyle (quadObj, GLU_SILHOUETTE); end; case orientation of INSIDE : gluQuadricOrientation (quadObj, GLU_INSIDE); OUTSIDE : gluQuadricOrientation (quadObj, GLU_OUTSIDE); end; case normals of NONE : gluQuadricNormals (quadObj, GLU_NONE); FLAT : gluQuadricNormals (quadObj, GLU_FLAT); SMOOTH : gluQuadricNormals (quadObj, GLU_SMOOTH); end; case gluobj of SPHERE : gluSphere (quadObj, 1.5, 10, 10); CONE : gluCylinder (quadObj, 0.0, 1.0, 1.5, 10, 10); CYLINDER : gluCylinder (quadObj, 1.0, 1.0, 1.5, 10, 10); DISK : gluDisk (quadObj, 0.0, 1.5, 10, 5); end; glPopMatrix; SwapBuffers(DC); end; procedure SetDCPixelFormat (hdc : HDC); var pfd : TPixelFormatDescriptor; nPixelFormat : Integer; begin FillChar (pfd, SizeOf (pfd), 0); pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; nPixelFormat := ChoosePixelFormat (hdc, @pfd); SetPixelFormat (hdc, nPixelFormat, @pfd); end; procedure TfrmGL.FormCreate(Sender: TObject); begin DC := GetDC (Handle); SetDCPixelFormat(DC); hrc := wglCreateContext(DC); wglMakeCurrent(DC, hrc); glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glLineWidth (1.5); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); glEnable (GL_DEPTH_TEST); glEnable (GL_COLOR_MATERIAL); glColor3f (1.0, 0.0, 0.0); quadObj := gluNewQuadric; ry := 0.0; tx := 0.0; end; procedure TfrmGL.FormDestroy(Sender: TObject); begin gluDeleteQuadric (quadObj); wglMakeCurrent(0, 0); wglDeleteContext(hrc); ReleaseDC (Handle, DC); DeleteDC (DC); end; procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin If Key = VK_ESCAPE then Close; If Key = VK_LEFT then begin ry := ry + 2.0; InvalidateRect(Handle, nil, False); end; If Key = VK_RIGHT then begin ry := ry - 2.0; InvalidateRect(Handle, nil, False); end; If Key = VK_UP then begin tx := tx - 0.1; InvalidateRect(Handle, nil, False); end; If Key = VK_DOWN then begin tx := tx + 0.1; InvalidateRect(Handle, nil, False); end; If Key = 49 then begin Inc (mode); If mode > High (mode) then mode := Low (mode); InvalidateRect(Handle, nil, False); end; If Key = 50 then begin Inc (gluobj); If gluobj > High (gluobj) then gluobj := Low (gluobj); InvalidateRect(Handle, nil, False); end; If Key = 51 then begin If orientation = INSIDE then orientation := OUTSIDE else orientation := INSIDE; InvalidateRect(Handle, nil, False); end; If Key = 52 then begin Inc (normals); If normals > High (normals) then normals := Low (normals); InvalidateRect(Handle, nil, False); end; end; procedure TfrmGL.FormResize(Sender: TObject); begin glViewport(0, 0, ClientWidth, ClientHeight); glMatrixMode (GL_PROJECTION); glLoadIdentity; glFrustum (-1, 1, -1, 1, 2, 9); glMatrixMode (GL_MODELVIEW); glLoadIdentity; // этот фрагмент нужен для придания трёхмерности glTranslatef(0.0, 0.0, -5.0); // перенос объекта - ось Z glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y InvalidateRect(Handle, nil, False); end; procedure TfrmGL.FormKeyPress(Sender: TObject; var Key: Char); begin if key = '-' then mx:=mx+1; if key = '+' then mx:=mx-1; InvalidateRect(Handle, nil, False); end; end. Список використаної літератури 1. Блінова Т.О., Порєв В.М. Комп'ютерна графіка / За ред. В.М.Горєва. - К.: Видавництво “Юніор”, 2004. - 456с., іл. 2. С.В.Глушаков, Г.А.Крабе Компютерная графика, Харьков 2002 3. OpenGl, технология ставшая символов, Учебник в примерах. 4. Конспект лекцій з предмету «Комп'ютерна графіка».
|