Контрольная работа: Методи поліпшення растрових зображень
glEnd; \
glPopMatnx;\SwapBuffers (Canvas.Handle);
wglMakeCurrent (0, 0) ;
На даному прикладі показаний трикутник. Тепер все, що малюється з нульовим значенням координати Z, не буде видно спостерігачу, оскільки ближню площину відсікання ми розташували на відстані трьох одиниць від ока спостерігача, розташованого в крапці (0, 0, 0). Тому перед відтворенням трикутника зміщуємо систему координат на п'ять одиниць вниз. Трикутник віддалився від спостерігача, і його вершини розташовуються вже не на межі вікна, а змістилися углиб екрану. Це нескладне міркування передує наступному прикладу - проект з підкаталогу Ех03. Для підвищення надійності роботи додатку користуємося явно одержуваним посиланням на контекст пристрою, а не значенням властивості canvas.Handle Відразу ж після отримання контексту відтворення робимо його поточним в обробнику події create форми, а безпосередньо перед видаленням звільняємо контекст в обробнику Destroy. Тепер такі параметри OpenGL, як колір фону і колір примітивів, можна задавати єдиний раз - при створенні форми, а не виконувати цю дію кожного разу при перемальовуванні екрану. На відміну від всіх попередніх проектів, в даному з'являється окремий обробник події, пов'язаної із зміною розмірів вікна. Якщо пригадати то, раніше при цій події виконувався той же код, що і при перемальовуванні вікна. У всіх прикладах, що залишилися, як правило, буде присутній окремий обробник події, пов'язаної із зміною розмірів вікна. У цьому обробнику задається область висновку і встановлюються параметри вигляду, після чого вікно необхідно перемальовувати:
procedureTfrmGL.FormResize(Sender: TObject);
beginlViewport (0, 0, ClientWidth, ClientHeight);
glLoadldentity; iFrustum (-1, 1 -1, 1, 3, 10); // видові параметри
lTranslatef (0.0, 0.0, -5.0); // початкове зрушення системи координат
InvalidateRect(Handle, nil. False);
end;
Код, пов'язаний з перемальовуванням вікна, тепер скорочується в становиться більш коректним:
Procedure TfrmGL.FormPaint(Sender: TObject);
WClear (GL_COLOR_BUFFER_BIT);
9lBegin (GLJTRIANGLES);
glVertex3f (-1, -1, 0);
glVertex3f (-l, 1, 0);
glVertex3f (1, 0, h);
glEnd;
SwapBuffers(DC);
end;
Аргументи команди giortho мають такий самий сенс, що і у giFrustum, але останні два аргументи можуть мати негативне значення. Крім цих двох команд, OpenGL надає ще декілька можливостей установки видових параметрів, наприклад, бібліотека glu містить команду giuOrtho2D. Ця команда має чотири аргументи, сенс яких такий же, як і у giortho. По своїй дії вона еквівалентна виклику giortho з вказівкою значення відстані до ближньої площини відсікання рівним мінус одиниці, і відстанню до дальньої площини відсікання рівним одиниці. Як при такій проекції виглядає куб з попередніх прикладів.
Зверніть увагу, що тут відсутнє початкове зрушення по осі Z:
procedureTfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glLoadldentity;
gluOrtho2D (-2, 2 -2, 2); // задаємо перспективу
glRotatef (30.0, 1.0, 0.0, 0.0); // поворот об'єкту - вісь X
glRotatef (60.0, 0.0, 1.0, 0.0); // поворот об'єкту - вісь Y