#include
/* GLUT kutubxonasini bog‘lash*/
/* oynaning dastlabki eni va balandligi (o‘lchamlari)*/
GLint Width = 512, Height = 512;
/* kubning hajmi */
const int CubeSize = 200;
/* ushbu funksiya ekranga chiqarilayotgan barcha ma’lumotlarni boshqaradi */
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();
}
/* ushbu funksiya oyna o‘lchami o‘zgargan holatini chaqirish uchun chaqiriladi */
void Reshape(GLint w, GLint h)
{
Width = w; Height = h;
/* ko‘rsatish sohasi o‘lchamini o‘rnatamiz */
glViewport(0, 0, w, h); // x, y, balandlik, kenglik
/* ortografik proeksiya */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, -1.0, 1.0); // chap, o‘ng, quyi, yuqori, yaqin, uzoq
}
/* klaviaturadan kelgan ma’lumotlarni qayta ishlovchi funksiya */
void Keyboard( unsigned char key, int x, int y )
{
#define ESCAPE '\033'
if( key == ESCAPE )
exit(0); }
/* ilovaning asosiy sikli */
main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(Width, Height);
glutInitWindowPosition(10,10);
glutCreateWindow("Qizil maydonga misol");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Keyboard);
glutMainLoop();
}
Ushbu dastur hajmi kichik bo‘lishiga qaramay OpenGL va GLUT kutubxonalarini qo‘llaydigan, istalgan tizimda ishlaydigan va kompilyasiya qilinadigan to‘liq tugallangan dastur.
GLUT kutubxonasi foydalanuvchi bilan teskari aloqa (callback function) deb nomlanuvchi funksiya yordamida o‘zaro aloqani quvvatlaydi. Agarda foydalanuvchi sichqonchani siljitsa, klaviatura tugmasini bossa yoki oyna o‘lchamini o‘zgartirsa, hodisa yuz beradi va foydalanuvchining tegishli (hodisalarga ishlov berish (teskari aloqaga ega funksiya)) funksiyasi chaqiriladi.
Yuqoridagi misolda keltirilgan main funksiyasini batafsil ko‘rib chiqamiz. U uchta qismdan tarkib topgan – OpenGL chizishi kerak bo‘lgan oynani inisiallash (faollashtirish), teskari aloqali funksiyalarni va hodisalarga ishlov berishning asosiy davrini sozlash.
Oynani inisiallash (faollashtirish) kadrning tegishli buferlari, boshlang‘ich holati va oyna o‘lchami, shuningdek oyna sarlavhasini sozlashdan tarkib topadi.
glutInit (&argc, argv) funksiyasi GLUT kutubxonasining o‘zini dastlabki inisiallashuvga tayyorlaydi.
glutInitDisplayMode (GLUT_RGB) buyrug‘i kadr buferini inisiallashtiradi va to‘liq rangli (palitrasiz) RGB rejimiga to‘g‘rilaydi.
glutInitWindowSize (Width, Height) oynaning boshlang‘ich o‘lchamini tayinlash uchun ishlatiladi.
glutCreateWindow ("Qizil maydonga misol") oyna sarlavhasini kiritadi va oynani ekranda vizuallashtiradi.
Shunda quyidagi buyruqlar
glutDisplayFunc (Display);
glutReshapeFunc (Reshape);
glutKeyboardFunc (Keyboard);
Display(), Reshape() va Keyboard() funksiyalari oynani qayta chizish, oyna o‘lchamlarini o‘zgartirish, klaviatura klavishini bosganda chaqiriladigan funksiyalar sifatida qayd qiladi.
Barcha hodisalarni nazorat qilish va kerakli funksiyalarni chaqirish glutMainLoop () funksiyasining cheksiz davri ichida bajariladi.
Ko‘rishimiz mumkinki, GLUT kutubxonasi OpenGL tarkibiga kirmaydi, ya’ni OpenGL va oynali nimtizimning orasidagi keltirilgan eng kichik interfeysdir. OpenGL ilovasi aniq bir platformalar uchun maxsus API (Win32, X Window va b.) yordamida yozilishi mumkin, ular esa o‘z navbatida yanada kengroq imkoniyatlarni taqdim etadi. GLUT kutubxonasi bilan ishlash A ilovada batafsil berilgan.
OpenGL buyruqlarini chaqirish hodisalarni qayta ishlovchida sodir bo‘ladi. Ular keyingi bo‘limlarda kengroq qarab chiqiladi. Hozir esa, ekranda chizishga javob beradigan kodga ega bo‘lgan Display funksiyasiga e’tibor qaratamiz.
Display funksiyasiga tegishli quyidagi buyruqlar ketma-ketligi
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();
oynani tozalaydi va rang hamda to‘rtta burchak uchlari koordinatalarini berib ekranga kvadrat chiqaradi.
D.1 ilovasida sichqoncha tugmasini bosganda ekranda har xil rangdagi tasodifiy to‘g‘ri to‘rtburchakni chizadigan yana bir murakkab bo‘lmagan dastur keltirilgan.
Do'stlaringiz bilan baham: |