Архів якісних рефератів

Знайти реферат за назвою:         Розширений пошук

Меню сайту

Головна сторінка » Інформатика, програмування

Програмування 3D-графіки (шпора)

Програмування 3D-графіки.

1. Основні можливості бібліотеки OpenGL.

Стандартна графічна бібліотека OpenGL призначена для роботи з різноманітними графічними об'єктами: робота з об'єктами 2D-графіки (точка, лінія, трикутник, чотирикутник, полігон); робота з об'єктами 3D-графіки; робота з висвітленням; робота з текстурами тощо. Бібліотека OpenGL йде з поставкою операційної системи Windows і включає два базових файли: opengl32.dll, glu32.dll, що знаходяться в системній папці. Для того щоб мати можливість використовувати функції вказаних dll, необхідно до головного модулю програми включити хайдери, "gl.h” та "glu.h”. На початку роботи з будь-яким додатком, що використовує функції OpenGL, необхідно здійснити прив'язку контексту OpenGL до контексту клієнтського вікна, у якому будуть виводитись графічні об'єкти OpenGL. Описувати можливості OpenGL ми будемо через функції його бібліотеки. Всі функції можна розділити на п'ять категорій: *Функції опису примітивів визначають об'єкти нижнього рівня ієрархії (примітиви), які здатна відображати графічна підсистема. В OpenGL у якості примітивів виділяють точки, лінії, багатокутники і т.д.; *Функції опису джерел світла служать для опису положення й параметрів джерел світла, розташованих у тривимірній сцені; *Функції завдання атрибутів. За допомогою завдання атрибутів програміст визначає, як будуть виглядати на екрані відображувані об'єкти. Інакше кажучи, якщо за допомогою примітивів визначається, що з'явиться на екрані, то атрибути визначають спосіб виведення на екран. В якості атрибутів OpenGL дозволяє задавати кольори, характеристики матеріалу, текстури, параметри освітлення; *Функції візуалізації дозволяють задати розташування спостерігача у віртуальному просторі, параметри об'єктива камери. Знаючи ці параметри, система зможе не тільки правильно побудувати зображення, але й відітнути об'єкти, що знаходяться поза полем зору; *Набір функцій геометричних перетворень дозволяють програмістові виконувати різні перетворення об'єктів – поворот, перенос, масштабування.

2. Інтерфейс бібліотеки OpenGL.

Прикладна програма

GLU

GL

GLUT

GLX

Win32 API

Буфер кадру

 

OpenGL складається з набору бібліотек. Всі базові функції зберігаються в основній бібліотеці(GL). Крім основної, OpenGL містить у собі декілька додаткових бібліотек. *бібліотека утиліт GL(GLU – GL Utility) - всі функції якої визначені через базові функції GL. До складу GLU увійшла реалізація більш складних функцій, таких як набір популярних геометричних примітивів (куб, куля, циліндр, диск), функції побудови сплайнів, реалізація додаткових операцій над матрицями і т.п. Рис. Організація бібліотеки OpenGL. OpenGL не містить у собі ніяких спеціальних команд для роботи з вікнами або введення інформації від користувача. Тому були створені спеціальні бібліотеки для забезпечення часто використовуваних функцій взаємодії з користувачем і для відображення інформації за допомогою віконної підсистеми. Найбільш популярною є бібліотека GLUT (GL Utility Toolkit). Формально GLUT не входить в OpenGL, але de facto включено майже в усі його дистрибутиви і реалізовано для різних платформ. GLUT надає тільки мінімально необхідний набір функцій для створення OpenGL-додатка. Функціонально аналогічна бібліотека GLX менш популярна. Надалі в цьому посібнику в якості основної буде розглядатися GLUT. Крім того, функції, специфічні для конкретної віконної підсистеми, звичайно входять у її прикладний програмний інтерфейс. Так, функції, що підтримують виконання OpenGL, є в складі Win32 API й X Window. На рисунку схематично представлена організація системи бібліотек у версії, що працює під управлінням системи Windows. Аналогічна організація використовується й в інших версіях OpenGL.

3. Архітектура бібліотеки OpenGL.

Функції OpenGL реалізовані в моделі клієнт-сервер. Додаток виступає в ролі клієнта – він виробляє команди, а сервер OpenGL інтерпретує та виконує їх. Сам сервер може перебувати як на тому ж комп'ютері, на якому перебуває клієнт (наприклад, у вигляді динамічної бібліотеки – DLL), так і на іншому (при цьому може бути використаний спеціальний протокол передачі даних між машинами).

GL обробляє й малює в буфері кадру графічні примітиви з урахуванням деякого числа обраних режимів. Кожен примітив – це точка, відрізок, багатокутник і т.д.

Примітиви визначаються набором з однієї або більше вершин (vertex). Вершина визначає точку, кінець відрізка або кут багатокутника. З кожною вершиною асоціюються деякі дані (координати, кольори, нормаль, текстурні координати і т.д.), що називаються атрибутами. У переважній більшості випадків кожна вершина обробляється незалежно від інших.

З погляду архітектури графічна система OpenGL є конвеєром, складається з декількох послідовних етапів обробки графічних даних.

Команди OpenGL завжди обробляються в тому порядку, у якому вони надходять, хоча можуть відбуватися затримки перед тим, як виявиться ефект від їхнього виконання. У більшості випадків OpenGL надає безпосередній інтерфейс, тобто визначення об'єкта викликає його візуалізацію в буфері кадру.

4. Ініціалізація бібліотеки OpenGL.

Для ініціалізації OpenGL у функції SetupWindow() класу головного вікна TOpenGLgraf визивається функція Init() в якій виконується підключення OpenGL() до контексту клієнтського вікна. Проте перед цим треба проініціалізувати структуру типу PIXELFORMATDESCRIPTOR. Нижче наведемо ініціалізацію структури пікселя pfd.

PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR), // размер этого pfd|

1, // номер версии

PFD_DRAW_TO_WINDOW | // поддерживайте окно

PFD_SUPPORT_OPENGL | // support OpenGL // поддерживайте OPENGL

PFD_DOUBLEBUFFER, // double buffered // вдвоем|дважды| буферизовано

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth 24-разрядная цветная глубина

0, 0, 0, 0, 0, 0, // color bits ignored цветные проигнорированные куски|бит|

0, // no alpha buffer // нет алфавитного буфера

0, // shift bit ignored // сменный проигнорированный кусок|бит|

0, // no accumulation buffer // нет буфера накопления|аккумуляции|

0, 0, 0, 0, // accum bits ignored // accum| куски|бит| проигнорировали

32, // 32-bit z-buffer // 32-разрядный z-buffer|

0, // no stencil buffer // нет буфера трафарета

0, // no auxiliary buffer // нет вспомогательного буфера

PFD_MAIN_PLANE, // main layer // главный слой

0, // reserved // занято

0, 0, 0 // layer masks ignored // проигнорированные маски слоя

};

При ініціалізації зазначеної структури варто зупинитись на константі PFD_DOUBLEBUFFER, яка включає режим подвійної буферизації, коли виведення здійснюється не на екран, а в пам'ять, потім вміст буферу виводиться на екран.

УВАГА!!! Незважаючи на початкові настройки структури формату пікселю, система підбере найоптимальніші настройки під задану робочу станцію (параметри відеокарти, настройка палітри тощо). Принципове значення має третій параметр структури, який включає флаги прив'язки пікселю до контекста виведення клієнтського вікна, а також надає можливість використовувати декілька буферів виведення (змінна PFD_DOUBLEBUFFER).

5. Управління кольорами примітивів (OpenGL).

Для завдання поточних кольорів вершини використовуються команди :

void glColor[3 4][b s i f] (GLtype components)

void glColor[3 4][b s i f]v (GLtype components)

Перші три параметри задають R, G, B компоненти кольорів, а останній параметр визначає коефіцієнт непрозорості (так званий альфа-компонент). Якщо в назві команди зазначений тип 'f'' (float), то значення всіх параметрів повинні належати відрізку [0,1], при цьому по умовчанню значення альфа-компоненти встановлюється рівним 1.0, що відповідає повній непрозорості. Тип 'ub' (unsigned byte) має на увазі, що значення повинні лежати у відрізку [0,255].

Вершинам можна призначати різні кольори, і, якщо включено відповідний режим, то буде проводитися лінійна інтерполяція кольорів по поверхні примітиву.

Для управління режимом інтерполяції використовується команда

void glShadeModel (GLenum mode)

виклик якої з параметром GL_SMOOTH включає інтерполяцію (установка по умовчанню), а з GL_FLAT – відключає.

6. Побудова точок і відрізків, призначення команди GL_LINE_STRIP (OpenGL).

GL_LINE_STRIP – малювання з'єднаних ліній;


 

Пример замкнутой линии с переливающимися цветами

glLineWidth(3); // ширина 3

glBegin(GL_LINE_STRIP); // см. ниже

glColor3ub(255,0,0);

glVertex3d(-2.7,3,0);

glVertex3d(-1,3,0);

glColor3f(0,1.0f,0);

glVertex3d(-1.5,3.3,0);

glColor3f(0,0,1.0f);

glVertex3d(-1,3.5,0);

glEnd();

7. Побудова штрихових ліній в OpenGL.

Функція glLineStipple() визначає маску штриховки лінії (16-річна константа). Для завдання стилю лінії за допомогою маски glLineStipple() необхідно включити режим GL_LINE_STIPPLE (glEnable(GL_LINE_STIPPLE)).

8. Побудова трикутників в OpenGL.

GL_TRIANGLES - малювання трикутників, кожні окремі три вершини визначають трикутник; якщо задано не кратне трьом число вершин, то останні вершини ігноруються. GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN – різні способи малювання з'єднаних трикутників; Наприклад, щоб намалювати трикутник з різними кольорами у вершинах, досить написати:

GLfloat BlueCol[3] = {0,0,1};

glBegin(GL_TRIANGLES);

glColor3f(1.0, 0.0, 0.0); /* красный */

glVertex3f(0.0, 0.0, 0.0);

glColor3ub(0,255,0); /* зеленый */

glVertex3f(1.0, 0.0, 0.0);

glColor3fv(BlueCol); /* синий */

glVertex3f(1.0, 1.0, 0.0);

glEnd();


 

9. Відмітні особливості команд: GL_TRIANGLES, GL_TRIAGLE_ STRIP GL_ TRIAGLE_FAN (OpenGL).

При роботі з об'єктами 2D-графіки звернемо увагу на наступні особливості. Всі об'єкти малюються в межах функцій glBegin(), glEnd(). Вхідним параметром в функції glBegin() можуть бути наступні константи: GL_TRIANGLES – малювання трикутників; GL_TRIANGLE_STRIP - кожна наступна вершина задає трикутник разом із двома попередніми. GL_TRIANGLE_FAN - трикутники задаються першою вершиною й кожною наступною парою вершин (пари не перетинаються).


 

Наприклад, щоб намалювати трикутник з різними кольорами у вершинах, досить написати:

GLfloat BlueCol[3] = {0,0,1};

glBegin(GL_TRIANGLES);

glColor3f(1.0, 0.0, 0.0); /* красный */

glVertex3f(0.0, 0.0, 0.0);

glColor3ub(0,255,0); /* зеленый */

glVertex3f(1.0, 0.0, 0.0);

glColor3fv(BlueCol); /* синий */

glVertex3f(1.0, 1.0, 0.0);

glEnd();

10. Побудова чотирикутників в OpenGL.

GL_QUADS – малювання чотирикутників, кожна окрема четвірка вершин визначає чотирикутник; якщо задано не кратне чотирьом число вершин, то останні вершини ігноруються. GL_QUAD_STRIP - чотирикутник з номером n визначається вершинами з номерами 2n-1, 2n, 2n+2, 2n+1.

Усе, що робить ця програма – малює в центрі вікна червоний квадрат. Проте, навіть на цьому простому прикладі можна зрозуміти принципи програмування за допомогою OpenGL.

#include <stdlib.h>

/* подключаем библиотеку GLUT */

#include <gl/glut.h>

/* начальная ширина и высота окна */

GLint Width = 512, Height = 512;

/* размер куба */

const int CubeSize = 200;

/* эта функция управляет всем выводом на экран */

void Display(void)

{

int left, right, top, bottom;

left = (Width - CubeSize) / 2;

right = left + CubeSize;

bottom = (Height - CubeSize) / 2;

top = bottom + CubeSize;

glClearColor(0, 0, 0, 1);

glClear(GL_COLOR_BUFFER_BIT);

 

glColor3ub(255,0,0);

glBegin(GL_QUADS);

glVertex2f(left,bottom);

glVertex2f(left,top);

glVertex2f(right,top);

glVertex2f(right,bottom);

glEnd();

glFinish();

}

11. Побудова опуклих багатокутників в OpenGL.

GL_POLYGON - послідовно задаються вершини опуклого багатокутника.

Для згладжування полігонів використовується константа GL_POLYGON_SMOOTH.

//бокал (верх) без мартини

glEnable(GL_POLYGON_SMOOTH);

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glBegin(GL_TRIANGLE_FAN);

glColor3ub(200,200,200);

glVertex3d(-2.5,1,0);

glVertex3d(2.5,1,0);

glVertex3d(2,0,0);

glVertex3d(-2,0,0);

glEnd();

glDisable(GL_POLYGON_SMOOTH);

//мартини в бокале

glEnable(GL_POLYGON_SMOOTH);

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glBegin(GL_TRIANGLE_FAN);

glColor3ub(255,200,200);

glVertex3d(-2,0,0);

glVertex3d(2,0,0);

glVertex3d(1.5,-1,0);

glVertex3d(1,-1.5,0);

glVertex3d(0,-2,0);

glVertex3d(-1,-1.5,0);

glVertex3d(-1.5,-1,0);

glEnd();

glDisable(GL_POLYGON_SMOOTH);

//подставка

glEnable(GL_POLYGON_SMOOTH);

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glBegin(GL_TRIANGLE_FAN);

glColor3ub(200,200,200);

glVertex3d(-1,-4.75,0);

glVertex3d(0,-4.25,0);

glVertex3d(1,-4.75,0);

glEnd();

glDisable(GL_POLYGON_SMOOTH);



 

12. Системи координат в OpenGL.

В OpenGL використовуються як основні три системи координат: лівостороння, правостороння й віконна. Перші дві системи є тривимірними й відрізняються одна від одної напрямком осі z: у правосторонній вона спрямована на спостерігача, у лівосторонній – у глибину екрана. Вісь x спрямована праворуч щодо спостерігача, вісь y – вгору.

x

z

y

Лівостороння система використовується для завдання значень параметрам команди gluPerspective(), glOrtho(). Правостороння система координат використовується у всіх інших випадках. Відображення тривимірної інформації відбувається у двовимірну віконну систему координат.

x

z

a) правостороння система б) лівостороння система

x

y


 

в) віконна система

Рис. 1 Системи координат в OpenGL

 

Можна сказати, що OpenGL дозволяє шляхом маніпуляцій з матрицями моделювати як праву, так і ліву систему координат. Але на даному етапі краще піти простим шляхом і запам'ятати: основною системою координат OpenGL є правостороння система.

13. Робота з матрицями (OpenGL).

Розрізняють три типи матриць: модельно-видова, матриця проекцій і матриця текстури. Всі вони мають розмір 4x4. Видова матриця - визначає перетворення об'єкта у світових координатах, такі як паралельний перенос, зміна масштабу й поворот. Матриця проекцій - визначає, як будуть проектуватися тривимірні об'єкти на площину екрана (у віконні координати), а матриця текстури - визначає накладення текстури на об'єкт. Множення координат на матриці відбувається в момент виклику відповідної команди OpenGL, що визначає координату (як правило, це команда glVertex*). Для того щоб вибрати, яку матрицю треба змінити, використовується команда: void glMatrixMode (GLenum mode), виклик якої зі значенням параметра mode рівним GL_MODELVIEW, GL_PROJECTION, або GL_TEXTURE включає режим роботи з модельно-видовою матрицею, матрицею проекцій, або матрицею текстури відповідно. Для визначення елементів матриці поточного типу викликається команда: void glLoadMatrix[f d] (GLtype *m), де m вказує на масив з 16 елементів типу float або double відповідно до назви команди, при цьому спочатку в ньому повинен бути записаний перший стовпець матриці, потім другий, третій і четвертий. Ще раз звернемо увагу: у масиві m матриця записана по стовпцях. Команда void glLoadIdentity (void) заміняє поточну матрицю на одиничну. Часто буває необхідно зберегти вміст поточної матриці для подальшого використання, для чого застосовуються команди void glPushMatrix (void) та void glPopMatrix (void). Для множення поточної матриці на іншу матрицю використовується команда: void glMultMatrix[f d] (GLtype *m), де параметр m повинен задавати матрицю розміром 4x4. Якщо позначити поточну матрицю за М, передану матрицю за T, то в результаті виконання команди glMultMatrix поточною стає матриця M * T.

14. Пояснити значення перших рядків модельно - видової матриці (4х4) (OpenGL).

Для завдання різних перетворень об'єктів сцени в OpenGL використовуються операції над матрицями. При цьому значне місце належить модельно-видовій матриці (матриця моделі). Вона має розмір 4х4. Ця матриця визначає перетворення об'єкта у світових координатах, такі як паралельний перенос, зміна масштабу й поворот. По умовчанню робота здійснюється з одиничною матрицею (елементи, розташовані на головній діагоналі – 1, решта елементів – 0). Перші три стовпця матриці характеризують зміну відповідних просторових координат, X, Y, Z. Четвертий стовпчик являє собою вільний член, тобто ту величину на яку зміщується система координат.

(x', y', z', 1) T = M * (x, y, z, 1) T

де M – матриця модельно-видового перетворення. Перспективне перетворення й проектування виконується аналогічно. Сама матриця може бути створена за допомогою наступних команд:

void glTranslate[f d] (GLtype x, GLtype y, GLtype z)

void glRotate[fd] (GLtypeangle, GLtypex, GLtypey, GLtypez)

voidglScale[f d] (GLtype x, GLtype y, GLtype z)

glTranlsate*() здійснює перенос об'єкта, додаючи до координат його вершин значення своїх параметрів. glRotate*() здійснює поворот об'єкта проти часової стрілки на кут angle (вимірюється в градусах) навколо вектора (x,y,z). glScale*() здійснює масштабування об'єкта (стискання або розширення) уздовж вектора (x,y,z), множачи відповідні координати його вершин на значення своїх параметрів.

15. З якою метою виконується множення матриць (OpenGL).

mumnog() – функція перемноження двох матриць;

Множення координат на матриці відбувається в момент виклику відповідної команди OpenGL, що визначає координату (як правило, це команда glVertex*)

16. Перенесення графічного об'єкту і як при цьому змінюється матриця (OpenGL).

При зміні масштабу (функція glScalef()), повороту і (glRotatef()), та переміщенні (glTranslatef()) модельно-видова матриця змінюється, і графічні об'єкти виводяться у відповідності з цими змінами.

17. Масштабування об'єктів і як при цьому змінюється матриця (OpenGL).

При зміні масштабу матриці (функція glScalef), модельно-видова матриця змінюється, і графічні об'єкти виводяться у відповідності з цими змінами. При роботі з графічними об'єктами рекомендується працювати з одиничною матрицею. Крім того доцільно зберігати у пам'яті поточне значення матриці за допомогою функції glPushMatrix() та відновлювати його в кінці за допомогою функції glPopMatrix().

18. Поворот об'єктів і як при цьому змінюється матриця (OpenGL).

При повороті (glRotatef()модельно-видова матриця змінюється, і графічні об'єкти виводяться у відповідності з цими змінами. При роботі з графічними об'єктами рекомендується працювати з одиничною матрицею. Крім того доцільно зберігати у пам'яті поточне значення матриці за допомогою функції glPushMatrix() та відновлювати його в кінці за допомогою функції glPopMatrix().

 

19. Область виведення з використанням функції glViewPort().

Область виведення являє собою прямокутник у віконній системі координат, розміри якого задаються командою:

void glViewPort (GLint x, GLint y, GLint width, GLint height)

в) віконна система

Значення всіх параметрів задаються у пікселях і визначають ширину й висоту області виведення з координатами лівого нижнього кута (x,y) у віконній системі координат. Розміри віконної системи координат визначаються поточними розмірами вікна додатка, точка (0,0) знаходиться в лівому нижньому куті вікна. Використовуючи параметри команди glViewPort(), OpenGL обчислює віконні координати центра області виведення (ox,oy) по формулах ox=x+width/2, oy=y+height/2. Нехай px=width, py=height, тоді можна знайти віконні координати кожної вершини: (xw, yw, zw)T = ( (px/2) xn+ ox , (py/2) yn+ oy , [(f-n)/2] zn+(n+f)/2) T. При цьому цілі додатні величини n та f задають мінімальну й максимальну глибину точки у вікні й по умовчанню рівні 0 й 1 відповідно. Глибина кожної точки записується в спеціальний буфер глибини (z-буфер), який використовується для видалення невидимих ліній і поверхонь. Установити значення n та f можна викликом функції: void glDepthRange (GLclampd n, GLclampd f). Команда glViewPort() звичайно використовується у функції, зареєстрованої за допомогою команди glutReshapeFunc(), яка викликається, якщо користувач змінює розміри вікна додатка.

20. Quadric-об'єкти бібліотеки glu.

У бібліотеці GLU описані складні фігури, такі як сфера, циліндр, диск тощо. Для того, щоб намалювати сферу або циліндр, треба спочатку створити об'єкт спеціального типу GLUquadricObj за допомогою команди GLUquadricObj* gluNewQuadric(void); а потім викликати відповідну команду:

void gluSphere (GLUquadricObj * qobj, GLdouble radius, // рисуем сферу
GLint slices, GLint stacks)

void gluCylinder (GLUquadricObj * qobj, // рисуем цилиндр с любым радиусом
GLdouble baseRadius,

GLdouble topRadius,

GLdouble height,

GLint slices,

GLint stacks)

де параметр slices задає число розбивок навколо осі z, а stacks – уздовж осі z.

gluQuadricDrawStyle(quadObj, GLU_FILL); // устанавливаем стиль: закрашенный

21. Привести фрагмент програмного виведення сфери і пояснити призначення параметрів функції gluSpere.

gluSphere() – малювання сфери; Щоб намалювати сферу треба спочатку створити об'єкт спеціального типу GLUquadricObj за допомогою команди: GLUquadricObj* gluNewQuadric(void);а потім викликати команду:

void gluSphere (GLUquadricObj * qobj, GLdouble radius,
GLint slices, GLint stacks)

параметр slices задає число розбивок навколо осі z, а stacks – уздовж осі z.

22. Привести фрагмент програмного виведення конуса і пояснити призначення параметрів функції

gluCylinder.

gluCylinder() – малювання конусу; Щоб намалювати конус, треба спочатку створити об'єкт спеціального типу GLUquadricObj за допомогою команди: GLUquadricObj* gluNewQuadric(void); а потім викликати команду:

void gluCylinder (GLUquadricObj * qobj,
GLdouble baseRadius,

GLdouble topRadius,

GLdouble height,

GLint slices,

GLint stacks)

де параметр slices задає число розбивок навколо осі z, а stacks – уздовж осі z.

23. Привести фрагмент програмного виведення циліндра і пояснити призначення  параметрів функції gluCylinder.

gluCylinder() – малювання циліндру;

Щоб намалювати циліндр, треба спочатку створити об'єкт спеціального типу GLUquadricObj за допомогою команди

GLUquadricObj* gluNewQuadric(void);

а потім викликати відповідну команду:

void gluCylinder (GLUquadricObj * qobj,
GLdouble baseRadius,

GLdouble topRadius,

GLdouble height,

GLint slices,

GLint stacks)

де параметр slices задає число розбивок навколо осі z, а stacks – уздовж осі z.


 

24. Передача изображения при тектурировании(фрагмент программы)

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

Для использования текстуры с целью придания реалистичности виртуальным графическим объектам необходимо выполнить следующие действия:

- получить из файла или создать программно рисунок текстуры;

- создать образ текстуры в памяти;

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

.Получение текстурной заготовки в формате OpenGL.

OpenGl имеет собственный внутренний формат графических образов, поэтому для воспроизведения растрового изображения небходимо преобразовать входной образ в этот внутренний формат, представляющий собой просто последовательность троек интенсивностей компонентов красного, зеленого и синего цветов. Самый простой способ преобразования формата Windows DIB в формат OpenGL – использовать специально предназначенную для этого команду

AUX_RGBImageRec * auxDIBImageLoad(strFile),

принимающую имя файла и возвращающую указатель на структуру с образом в формате OpenGL. Более сложный спосб «ручного» преобразования вы найдете в [1].

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

Обязательное условие, которое необходимо выполнить - привести размеры изображения, используемого в качестве текстуры, к кратным степеням двойки, ближайшим к исходным размерам. Алгоритм и реализующую его подпрограмму мы позаимствуем в [1]:

BOOL TransDibToOpenGL()

{

GLint glMaxTexDim ;

double xPow2, yPow2;

int ixPow2, iyPow2;

int xSize2, ySize2;

//Получим от OpenGL максимально допустимый размер текстуры

glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);

//Ограничимся размерами не более 256 пикселей

glMaxTexDim = min(256, glMaxTexDim);

//вычислим показатели степени двойки по каждому размеру

if (m_iWidth <= glMaxTexDim) xPow2 = log((double)m_iWidth) / log(2.0);

else xPow2 = log((double)glMaxTexDim) / log(2.0);

if (m_iHeight <= glMaxTexDim) yPow2 = log((double)m_iHeight) / log(2.0);

else yPow2 = log((double)glMaxTexDim) / log(2.0);

ixPow2 = (int)xPow2;

iyPow2 = (int)yPow2;

//Если произошло усечение, добавим 1

if (xPow2 != (double)ixPow2) ixPow2++;

if (yPow2 != (double)iyPow2) iyPow2++;

//Вычислим новые размеры

xSize2 = 1 << ixPow2; ySize2 = 1 << iyPow2;

//Выделим память под новый образ

BYTE *pData = (BYTE*)malloc(xSize2 * ySize2 * 3 * sizeof(BYTE));

if (!pData) return FALSE;

//Преобразуем образ

BOOL bRes = gluScaleImage(GL_RGB, m_iWidth, m_iHeight,

GL_UNSIGNED_BYTE, m_pBits,

xSize2, ySize2, GL_UNSIGNED_BYTE, pData);

if(bRes){OutputGlError("Ошибка выполнения команды gluScaleImage");

return FALSE; }

//Освобождаем память под старым образом

free(m_pBits);

//Переустановим размеры изображения текстуры

m_pBits = pData; m_iWidth = xSize2 ;m_iHeight = ySize2 ;

return TRUE ;}

Здесь используется команда OpenGL

gluScaleImage(

Glenum format, //(из набора форматов данных пикселей //GL_COLOR_INDEX,GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, //GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE,)

Glint win, Glint hin, //ширина и высота источника масштабируемого образа

Glenum typein, //тип данных для datain – GL_BITMAP, GL_INT, GL_FLOAT и пр.

сonst void* datain, //указатель на приемник образа

Glint wout, Glint hout, //размеры приемника образа

Glenum typeout, //тип данных для dataout

void * dataout) //адрес приемника образа

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

void glTexImage1D( GLenum target, GLint level, GLint components, GLsizei width,

GLint border, GLenum format, GLenum type, const GLvoid *pixels);

void glTexImage2D( GLenum target, GLint level, GLint components, GLsizei width,

GLsizei height, GLint border, GLenum format, GLenum type,

const GLvoid *pixels );

Аргументы этих команд:

target – тип создаваемой текстуры GL_TEXTURE_1D или GL_TEXTURE_2D.

level – число уровней детализации текстуры: 0 базовый, к – уменьшенный в к раз

components – 1,2,3, или 4 цветовых компонента текстуры

width, height - размеры образа = стенпень двойки + 2*border

border = 0 или 1 – ширина границы

format – формат данных пикселей:

GL_COLOR_INDEX – каждый элемент – индекс цвета

GL_RED - каждый элемент – красный компонент

GL_GREEN,GL_BLUE,GL_ALPHA – аналогично

GL_RGB – каждый элемент –3-компонентный

GL_RGBA - 4-компонентные элементы

GL_LUMINANCE – 1 компонент яркости

GL_LUMIMANCE_ALPHA – 4-кмпон. Яркости

type - тип данных пикселя

pixels – указатель на образ данных в памяти

Для работы с текстурой небходимо разрешить соответствующий режим командой glEnable(GL_TEXTURE_[1 2]D).

В OpenGL есть еще 2 команды, иногда позволяющие с меньшими затратами решить ту же задачу:int gluBuild2DMipmaps( GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const void * data );int gluBuild1DMipmaps( GLenum target, GLint components, GLint width, GLenum format, GLenum type, const void * data );Они получают входной образ data и формируют образы всех уровней детализации – параметры этих команд такие же, как у glTexImage[1 2]D.

 

25. Накладення текстури на об'єкти (фрагмент програми OpenGL).

s

t

(0,0)

(0,1)

(1,1)

(1,0)

Під текстурою розуміється деяке зображення, яке треба певним чином нанести на об'єкт, наприклад, для додання рельєфності поверхні. Накладення текстури на поверхню об'єктів сцени підвищує її реалістичність, однак при цьому треба враховувати, що цей процес вимагає обчислювальних витрат, особливо якщо OpenGL не підтримується апаратно. Для роботи з текстурою варто виконати такі дії: вибрати зображення й перетворити його до потрібного формату; передати зображення в OpenGL; визначити як текстура буде наноситися на об'єкт та як вона буде з ним взаємодіяти; зв'язати текстуру з об'єктом. При накладенні текстури, як уже згадувалося, треба враховувати випадок, коли розміри текстури відрізняються від віконних розмірів об'єкта, на який вона накладається. При цьому можливо як розширення, так і стискання зображення, і те, як будуть проводитися ці перетворення, може серйозно вплинути на якість побудованого зображення. Для визначення положення точки на текстурі використовується параметрична система координат (s,t), причому значення s і t перебувають у відрізку [0,1] (див. рисунок)

Рис. Текстурні координати

Для зміни різних параметрів текстури застосовуються команди:

void glTexParameter[i f] (GLenum target, GLenum pname,
GLenum param)

void glTexParameter[i f]v (GLenum target, GLenum pname,
Glenum* params)





Реферат на тему: Програмування 3D-графіки (шпора)


Схожі реферати



5ka.at.ua © 2010 - 2016. Всі права застережені. При використанні матеріалів активне посилання на сайт обов'язкове.    
.