Perpustakaan grafik Opengl. Aplikasi OpenGL Interaktif

Berkenalan dengan OpenGL anda perlu bermula dengan hakikat bahawa OpenGL adalah spesifikasi. Itu. OpenGL hanya mentakrifkan satu set keupayaan yang diperlukan. Pelaksanaan bergantung pada platform tertentu.
OpenGL adalah merentas platform, bebas bahasa pengaturcaraan API untuk bekerja dengan grafik. OpenGL ialah API peringkat rendah, jadi adalah idea yang baik untuk mempunyai sedikit pemahaman tentang grafik secara umum dan beberapa algebra linear asas untuk bekerja dengannya.

Penamaan

Katakan beberapa perkataan tentang menamakan fungsi dalam OpenGL. Pertama, nama semua fungsi yang disediakan secara langsung oleh OpenGL bermula dengan awalan gl. Kedua, fungsi yang menentukan parameter tertentu yang dicirikan oleh set nombor (contohnya, koordinat atau warna) mempunyai akhiran bentuk [bilangan parameter + jenis parameter + perwakilan parameter].
  • Bilangan parameter - menunjukkan bilangan parameter yang diterima. Menerima nilai berikut: 1 , 2 , 3 , 4
  • Jenis parameter - menunjukkan jenis parameter yang diterima. Nilai berikut mungkin: b, s, i, f, d, ub, kami, ui. Itu. byte (char dalam C, integer 8-bit), pendek (integer 16-bit), int (integer 32-bit), float (nombor titik terapung), double (nombor titik terapung ketepatan ganda), bait tidak bertanda, pendek tidak bertanda, unsigned int (tiga yang terakhir ialah integer yang tidak ditandatangani)
  • Perwakilan parameter - menunjukkan dalam bentuk apa parameter diluluskan; jika setiap nombor adalah individu, maka tiada apa yang ditulis; jika parameter diluluskan sebagai tatasusunan, maka huruf dilampirkan pada nama fungsi v
Contoh: glVertex3iv menentukan koordinat bucu, yang terdiri daripada tiga integer yang diluluskan sebagai penunjuk kepada tatasusunan.

Seni grafik

Semua objek grafik dalam OpenGL mereka adalah koleksi titik, garis dan poligon. Terdapat 10 primitif yang berbeza dengan mana semua objek dibina. Kedua-dua dua dimensi dan tiga dimensi. Semua primitif, seterusnya, ditentukan oleh titik - bucu.
  • GL_POINTS- setiap bucu mentakrifkan satu titik
  • GL_LINES- setiap pasangan bucu mentakrifkan garis
  • GL_LINE_STRIP- setiap pasangan bucu mentakrifkan garis (iaitu penghujung baris sebelumnya ialah permulaan baris berikutnya)
  • GL_LINE_LOOP- serupa dengan yang sebelumnya, kecuali bahawa puncak terakhir disambungkan ke yang pertama dan angka tertutup diperolehi
  • GL_TRIANGLES- setiap tiga bucu individu mentakrifkan segitiga
  • GL_TRIANGLE_STRIP- setiap bucu seterusnya mentakrifkan segitiga bersama-sama dengan dua yang sebelumnya (ternyata riben daripada segi tiga)
  • GL_TRIANGLE_FAN- setiap segi tiga ditakrifkan oleh bucu pertama dan pasangan berikutnya (iaitu segitiga dibina di sekeliling bucu pertama, membentuk sesuatu yang serupa dengan diafragma)
  • GL_QUADS- setiap empat bucu membentuk segiempat
  • GL_QUAD_STRIP- masing-masing pasangan seterusnya bucu membentuk segiempat bersama-sama dengan sepasang yang sebelumnya
  • GL_POLYGON- mentakrifkan poligon dengan bilangan sudut yang sama dengan bilangan bucu yang diberi
Untuk menentukan primitif, gunakan pembinaan glBegin(primitive_type)...glEnd(). Bucu ditentukan glVertex*. Bucu ditetapkan mengikut arah lawan jam. Koordinat ditetapkan dari sudut kiri atas tetingkap. Warna bucu ditetapkan oleh arahan glColor*. Warna ditentukan sebagai RGB atau RGBA. Perintah glColor* bertindak pada semua bucu yang datang selepasnya sehingga perintah glColor* lain ditemui, atau pada semua bucu jika tiada perintah glColor* yang lain.
Berikut ialah kod yang melukis segi empat sama dengan bucu berwarna berbeza:
  1. glBermula (GL_QUADS) ;
  2. glVertex2i(250, 450);
  3. glVertex2i(250, 150);
  4. glVertex2i(550 , 150 ) ;
  5. glVertex2i(550 , 450 ) ;
  6. gEnd();

Asas Program OpenGL

Untuk kerja bebas platform dengan tingkap, anda boleh menggunakan . GLUT menjadikan kerja dengan OpenGL lebih mudah.
Untuk memulakan GLUT pada permulaan program anda perlu menghubungi glutInit(&argc, argv). Untuk menetapkan mod paparan, panggil glutInitDisplayMode(mod), di mana mod boleh mengambil nilai berikut:
  • GLUT_RGBA- termasuk warna empat komponen (lalai)
  • GLUT_RGB- sama seperti GLUT_RGBA
  • GLUT_INDEX- termasuk warna diindeks
  • GLUT_DOUBLE- membolehkan penimbal skrin dua kali
  • GLUT_SINGLE- membolehkan penimbal skrin tunggal (lalai)
  • GLUT_DEPTH- membolehkan Z-buffer (penampan kedalaman)
  • GLUT_STENCIL- termasuk penimbal stensil
  • GLUT_ACCUM- membolehkan penimbal pengumpulan
  • GLUT_ALPHA- membolehkan pengadunan alfa (ketelusan)
  • GLUT_MULTISAMPLE- membolehkan pensampelan berbilang (anti-aliasing)
  • GLUT_STEREO- termasuk imej stereo
Untuk memilih berbilang mod pada masa yang sama, gunakan bitwise ATAU "|". Contohnya: glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH) mendayakan penimbalan berganda, penampan Z dan warna quad. Saiz tetingkap ditetapkan glutInitWindowSize(lebar, tinggi). Kedudukannya ialah glutInitWindowPosition(x, y). Tetingkap dicipta oleh fungsi glutCreateWindow(window_title).
GLUT melaksanakan mekanisme yang didorong oleh peristiwa. Itu. Terdapat gelung utama yang bermula selepas permulaan, dan semua peristiwa yang diisytiharkan telah diproses di dalamnya. Contohnya, menekan kekunci pada papan kekunci atau menggerakkan kursor tetikus, dsb. Anda boleh mendaftarkan fungsi pengendali acara menggunakan arahan berikut:
  • void glutDisplayFunc (void (*func) (void))- menetapkan fungsi melukis imej
  • void glutReshapeFunc (void (*func) (int width, int height))- menetapkan fungsi untuk memproses saiz semula tetingkap
  • void glutVisibilityFunc (void (*func)(int state))- menetapkan fungsi untuk memproses perubahan dalam keadaan keterlihatan tetingkap
  • void glutKeyboardFunc (void (*func)(unsigned char key, int x, int y))- menetapkan fungsi untuk memproses ketukan kekunci papan kekunci (hanya yang menjana aksara ascii)
  • void glutSpecialFunc (void (*func)(int key, int x, int y))- menetapkan fungsi untuk memproses penekanan kekunci papan kekunci (yang tidak menjana aksara ascii)
  • void glutIdleFunc (void (*func) (void))- menentukan fungsi yang dipanggil apabila tiada acara lain
  • void glutMouseFunc (void (*func) (butang int, keadaan int, int x, int y))- mentakrifkan fungsi yang memproses arahan tetikus
  • void glutMotionFunc (void (*func)(int x, int y))- mentakrifkan fungsi yang memproses pergerakan kursor tetikus apabila sebarang butang tetikus ditekan
  • void glutPassiveMotionFunc (void (*func)(int x, int y))- mentakrifkan fungsi yang memproses pergerakan kursor tetikus apabila tiada butang tetikus ditekan
  • void glutEntryFunc (void (*func)(int state))- mentakrifkan fungsi yang mengendalikan pergerakan kursor di luar tetingkap dan pengembaliannya
  • void glutTimerFunc (unsigned int msecs, void (*func)(int value), value)- menentukan fungsi yang dipanggil pada pemasa
Kemudian anda boleh menjalankan gelung utama glutMainLoop().

Program pertama

Sekarang kita tahu asas bekerja dengan OpenGL. Anda boleh menulis program yang mudah untuk menyatukan pengetahuan.
Mari mulakan dengan memasukkan fail pengepala GLUT:

Sekarang kita sudah tahu apa yang hendak ditulis dalam utama. Mari daftarkan dua pengendali: untuk melukis kandungan tetingkap dan untuk memproses saiz semula. Kedua-dua pengendali ini pada asasnya digunakan dalam mana-mana program yang menggunakan OpenGL dan GLUT.
  1. int utama (int argc, char * argv)
  2. glutInit(& argc, argv);
  3. glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGBA) ; /*Dayakan penimbalan berganda dan warna empat komponen*/
  4. glutInitWindowSize(800, 600) ;
  5. glutCreateWindow("Pelajaran OpenGL 1" );
  6. glutReshapeFunc(bentuk semula);
  7. glutDisplayFunc(paparan);
  8. glutMainLoop();
  9. pulangan 0;

Sekarang kita perlu menulis fungsi pengendali untuk saiz semula tetingkap. Mari tetapkan kawasan output imej menjadi saiz keseluruhan tetingkap menggunakan arahan glViewport(x, y, lebar, tinggi). Kemudian muatkan matriks unjuran glMatrixMode(GL_PROJECTION), gantikan dengan unit glLoadIdentity() dan tetapkan unjuran ortogon. Dan akhirnya, muatkan matriks paparan model glMatrixMode(GL_MODELVIEW) dan menggantikannya dengan satu unit.
Hasilnya kami mendapat:
  1. kosongkan bentuk semula(int w, int h)
  2. glViewport(0 , 0 , w, h);
  3. glMatrixMode(GL_PROJECTION) ;
  4. glLoadIdentity() ;
  5. gluOrtho2D(0 , w, 0 , h);
  6. glMatrixMode(GL_MODELVIEW) ;
  7. glLoadIdentity() ;

Apa yang tinggal ialah menulis fungsi untuk melukis kandungan tetingkap. Kami akan melukis petak yang saya berikan di atas sebagai contoh. Anda perlu menambah kod yang sangat sedikit. Pertama, sebelum melukis, anda perlu mengosongkan pelbagai penampan menggunakan glClear (mod). Digunakan dengan cara yang sama seperti glutInitDisplayMode. Nilai yang mungkin:
  • GL_COLOR_BUFFER_BIT- untuk mengosongkan penimbal warna
  • GL_DEPTH_BUFFER_BIT- untuk membersihkan penimbal kedalaman
  • GL_ACCUM_BUFFER_BIT- untuk mengosongkan penimbal pengumpulan
  • GL_STENCIL_BUFFER_BIT- untuk membersihkan penimbal skrin
Dalam kes kami, kami hanya perlu mengosongkan penimbal warna, kerana Kami tidak menggunakan orang lain. Kedua, selepas melukis, anda perlu meminta OpenGL menukar penampan skrin yang digunakan glutSwapBuffers(), kerana kami telah mendayakan penimbalan berganda. Semuanya dilukis pada penimbal yang disembunyikan daripada pengguna dan kemudian penimbal diubah. Ini dilakukan untuk mendapatkan animasi lancar dan supaya tiada kesan berkelip-kelip skrin.
Kita mendapatkan:
  1. paparan kosong()
  2. glClear(GL_COLOR_BUFFER_BIT) ;
  3. glBegin(GL_QUADS) ;
  4. glColor3f(1.0, 1.0, 1.0);
  5. glVertex2i(250, 450);
  6. glColor3f(0.0, 0.0, 1.0);
  7. glVertex2i(250, 150);
  8. glColor3f(0.0, 1.0, 0.0);
  9. glVertex2i(550 , 150 ) ;
  10. glColor3f(1.0, 0.0, 0.0);
  11. glVertex2i(550 , 450 ) ;
  12. gEnd();
  13. glutSwapBuffers() ;

Pokoknya

Semua! Boleh disusun. Ia sepatutnya kelihatan seperti ini:

Biasanya, kawasan di mana ia perlu untuk menentukan kehadiran objek (kawasan pemilihan objek) ditakrifkan sebagai serpihan unjuran pemandangan. Sebagai contoh, pengguna memilih kawasan segi empat tepat dalam imej tayangan menggunakan manipulator (contohnya, penunjuk tetikus) atau hanya mengklik butang tetikus, dengan itu mentakrifkan kawasan pemilihan.

Oleh kerana dalam kes ini kawasan pemilihan ditentukan pada unjuran adegan tiga dimensi, adalah perlu untuk menentukan kawasan yang sepadan dengan adegan tiga dimensi (adegan pemilihan). Pemandangan yang anda pilih akan bergantung pada beberapa faktor: unjuran yang digunakan, saiz pemandangan dan kawasan output.

Untuk menentukan kawasan pemilihan 3D berdasarkan bahagian segi empat tepat unjuran pemandangan, maklumat tentang matriks unjuran diperlukan. Untuk melakukan ini, anda boleh menggunakan beberapa fungsi daripada perpustakaan GLUT, yang merupakan tambahan kepada perpustakaan OpenGL dan menyediakan beberapa keupayaan tambahan.

Dalam perpustakaan OpenTK, fungsi perpustakaan GLUT berada dalam kelas Glu dalam ruang nama Tao.OpenGL(C#). Dalam Object Pascal, semua fungsi dan prosedur perpustakaan GLUT diawali dengan "glu" untuk membezakannya daripada prosedur dan fungsi OpenGL.

Untuk menjana matriks unjuran berdasarkan serpihan unjuran pemandangan yang dipilih, anda boleh menggunakan arahan PickMatrix pustaka GLUT:

C#: void gluPickMatrix(double x, double y, double width, double height, int viewport); Objek Pascal: prosedur gluPickMatrix(x,y,lebar,tinggi: GLdouble; viewport: PGLint);

Perintah PickMatrix perpustakaan GLUT mengubah suai matriks semasa supaya saiz kawasan pemandangan sepadan dengan kawasan pemilihan yang ditakrifkan dalam koordinat unjuran pemandangan itu. Perintah itu mempunyai parameter berikut:

  • x, y – koordinat mendatar dan menegak bagi kawasan pemilihan dalam koordinat tetingkap di mana tayangan pemandangan 3D dipaparkan.
  • lebar, tinggi – lebar dan tinggi kawasan unjuran segi empat tepat yang dipilih bagi pemandangan 3D dalam koordinat tetingkap.
  • viewport ialah susunan empat elemen integer. Dalam C#, tatasusunan dihantar terus sebagai parameter; dalam Objek Pascal, penuding kepada tatasusunan diluluskan sebagai parameter. Tatasusunan mentakrifkan kawasan keluaran unjuran pemandangan 3D. Nilai tatasusunan mesti sepadan dengan koordinat kawasan output yang ditakrifkan menggunakan arahan ViewPort. Elemen tatasusunan ini mesti mempunyai nilai berikut: Elemen pertama dan kedua ialah koordinat x dan y di sebelah kiri bucu atas kawasan yang dipilih dalam koordinat skrin, 3 dan 4 elemen – lebar dan ketinggian kawasan ini.

Arahan mesti dilaksanakan sebelum melaksanakan perintah Ortho atau Frushtum, yang menjana matriks unjuran.

Meletakkan perpustakaan OpenGL ke dalam mod pemilihan

Untuk meletakkan perpustakaan ke dalam mod pemilihan, gunakan arahan RenderMode:

C#: int RenderMode(Mod RenderingMode); Objek Pascal: fungsi glRenderMode(mod: GLenum): GLint;

Parameter mod menentukan mod pengendalian pustaka OpenGL dan boleh mengambil salah satu daripada tiga nilai:

Jadual 10.1. Nilai yang mungkin untuk parameter mod arahan RenderMode
Penerangan Maknanya
Pustaka OpenTK, C# Objek Pascal
Mod pemilihan nilai yang diberi digunakan untuk meletakkan perpustakaan ke dalam mod pemilihan. RenderingMode.Pilih GL_SELECT
Mod pengimejan adegan. Mod ini digunakan secara lalai selepas pustaka OpenGL dimulakan. Dalam mod ini imej dijana oleh perpustakaan OpenGL. RenderingMode.Render GL_RENDER
Mod maklum balas. RenderingMode.Maklum Balas GL_MAKLUM BALAS

Selepas bertukar kepada mod pemilihan, OpenGL tidak memaparkan imej sehingga mod ditukar kepada mod pemaparan pemandangan menggunakan perintah RenderMode dengan nilai RenderingMode.Render dalam C# dan GL_RENDER dalam Object Pascal.

Menamakan dan membentuk objek pemandangan

Seperti yang dibincangkan di atas, tiada imej dijana dalam mod pemilihan. Perintah pengimejan dalam mod ini digunakan untuk menentukan objek yang berada dalam kawasan pemilihan.

Memandangkan objek yang digunakan oleh pengguna biasanya terbentuk daripada banyak primitif yang berbeza, timbunan nama digunakan untuk menentukan objek yang dipilih. Nama-nama adalah nilai integer. Sebelum mengeluarkan objek seterusnya bermula, nama (nombor) objek ini diletakkan pada timbunan nama. Jika, apabila membentuk objek, perpustakaan mengesan bahawa primitif objek ini jatuh ke dalam kawasan pemilihan, maka kandungan timbunan nama disalin ke penimbal pemilihan (bersama dengan beberapa maklumat tambahan) dimulakan dengan arahan SelectBuffer. Apabila primitif objek bernama lain memasuki kawasan pemandangan, kandungan timbunan nama juga akan disalin ke penimbal pemilihan. Oleh itu, nama (nombor) objek yang sepenuhnya atau sebahagiannya dalam kawasan pemilihan boleh diperolehi. Ia mesti diambil kira bahawa untuk menentukan dengan betul objek yang dipilih, adalah perlu bahawa transformasi koordinat objek bertepatan dengan yang dilakukan semasa membentuk imej adegan.

Beberapa arahan digunakan untuk bekerja dengan timbunan nama. Mengosongkan timbunan nama dilakukan menggunakan perintah InitNames:

C#: void InitNames(); Objek Pascal: prosedur glInitNames;

Menolak nama ke tindanan dilakukan menggunakan arahan PushName:

C#: void PushName(uint name); Objek Pascal: prosedur glPushName(nama: GLuint);

Nama itu diluluskan sebagai parameter arahan.

Sebelum timbunan nama boleh digunakan, ia mesti dimulakan menggunakan arahan InitNames. Kemudian anda perlu menolak satu elemen ke dalam timbunan menggunakan arahan PushName. Sebelum setiap objek dibentuk, satu elemen timbunan nama akan digantikan dengan nama objek yang dibentuk menggunakan arahan LoadName. Prosedur menggantikan elemen terakhir dalam timbunan nama dengan yang diberikan sebagai parameter. Oleh itu, permulaan dan penggunaan timbunan nama boleh digambarkan secara skematik seperti berikut:

InitNames; PushName(0); ...LoadName(1); //pembentukan objek No. 1 LoadName(2); //pembentukan objek No. 2 LoadName(3); //pembentukan objek No. 3 //dll. Penyenaraian 10.7. Gambar rajah untuk menggunakan timbunan nama untuk memilih objek

Memutuskan untuk mempelajari OpenGL, tetapi tahu di mana untuk bermula? Kami membuat pilihan bahan.

Apakah itu OpenGL

OpenGL (buka perpustakaan grafik) ialah salah satu piawaian grafik yang paling popular untuk bekerja dengan grafik. Program yang ditulis dengan bantuannya boleh dipindahkan ke hampir mana-mana platform, memperoleh hasil yang sama. OpenGL membenarkan anda untuk tidak menulis atur cara untuk perkakasan, tetapi untuk digunakan perkembangan sedia ada. OpenGL dibangunkan oleh Silicon Graphics, dengan kerjasama gergasi teknologi lain.

Dari sudut pengaturcaraan, OpenGL ialah antara muka perisian Untuk grafik raster, seperti pemecut grafik. Ia termasuk kira-kira 150 arahan berbeza yang mana pengaturcara boleh menentukan pelbagai objek dan membuat.

Bahan Kajian

Tutorial

Kursus dalam talian

  • Lynda - "Kursus OpenGL";
  • Universiti Tokyo - "Grafik Komputer Interaktif";
  • Universiti San Diego - "Asas Grafik Komputer."

Buku

Dalam bahasa Rusia

1. D. Shreiner - Buku Merah OpenGL - muat turun;

Buku ini adalah panduan rasmi untuk mempelajari OpenGL. Edisi terkini hampir berbeza sepenuhnya daripada versi asal; pengarang mengemas kininya mengikut perubahan dalam versi. Menurut ratusan pakar yang bekerja dengan Open GL, buku ini merupakan perkara pertama yang perlu diambil oleh sesiapa yang ingin mempelajari teknologi.

2. D. Serigala - Open GL 4. Bahasa Shader. Buku resipi (2015) - muat turun;

Buku ini merangkumi rangkaian penuh teknik pengaturcaraan GLSL, bermula dengan jenis asas pelorek - puncak dan serpihan - kepada geometri, pengiraan dan pelorek teselasi. Selepas membacanya, anda akan dapat menggunakan GPU untuk menyelesaikan pelbagai masalah.

3. D. Ginsburg - OpenGL ES 3.0. Panduan Pembangun (2014) - beli;

Dalam buku ini, penulis menyemak keseluruhan API dan bahasa untuk menulis shader. Anda juga akan menemui petua tentang mengoptimumkan prestasi, memaksimumkan kecekapan kerja API dan GPU dan kegunaan penuh OpenGL ES dalam pelbagai aplikasi.

4. V. Porev - Grafik komputer (2002) - muat turun;

Buku ini membincangkan cara untuk bekerja dengannya grafik komputer, masalah biasa, contoh atur cara dalam C++ diberikan.

Dalam Bahasa Inggeris

1. P. Shirley - Asas Grafik Komputer (2009) - ;

Buku ini bertujuan sebagai pengenalan kepada grafik komputer peringkat asas. Penulis merangkumi asas matematik grafik komputer dengan penekanan pada cara menggunakan asas ini untuk membangunkan kod yang cekap.

2. E. Angel - Grafik komputer interaktif - beli;

Buku ini ditujukan untuk semua pelajar yang mempelajari sains komputer dan pengaturcaraan secara mendalam. Animasi komputer dan grafik tidaklah rumit seperti dahulu. Berikutan kenyataannya, penulis menulis buku itu dalam bahasa yang paling mudah difahami.

Dalam bahagian ini, kita akan belajar cara mencipta imej 3D menggunakan fungsi perpustakaan OpenGL, supaya dalam bab seterusnya kita boleh membangunkan aplikasi Windows yang boleh dianggap sebagai alat untuk melihat hasil pengiraan saintifik. Bahan dalam bahagian ini akan membolehkan anda secara beransur-ansur bangkit dan menguasai teknologi yang sangat menarik untuk mencipta dan mengurus imej tiga dimensi. Mula-mula kita akan melihat keupayaan asas perpustakaan OpenGL, kemudian kita akan belajar bagaimana untuk mengawal Fungsi OpenGL Sebagai contoh aplikasi mudah jenis konsol dan hanya selepas itu kami akan mula membangunkan aplikasi Windows.

Pembaca mungkin tahu bahawa OpenGL ialah perpustakaan grafik berprestasi tinggi yang dioptimumkan bagi fungsi dan jenis data untuk memaparkan dua dan Grafik 3D. Piawaian OpenGL telah diluluskan pada tahun 1992. Ia berdasarkan perpustakaan IRIS GL yang dibangunkan oleh Silicon Graphics (www.sgi.com). OpenGL disokong pada semua platform. Selain itu, OpenGL disokong dalam perkakasan. Terdapat kad video dengan pemecut dan kad SD khusus yang melaksanakan primitif OpenGL dalam perkakasan.

Bahan dalam bahagian pertama pelajaran ini diilhamkan oleh buku yang sangat bagus (tersedia dalam talian) daripada Addison-Wesley, "Panduan Pengaturcaraan OpenGL, Panduan Rasmi untuk Mempelajari OpenGL". Jika pembaca memiliki Bahasa Inggeris, maka kami mengesyorkan membacanya.

Perpustakaan Terpaut

Pelaksanaan OpenGL oleh Microsoft termasuk set penuh Perintah OpenGL, iaitu fungsi global, termasuk dalam teras perpustakaan OPENGL32.LIB dan mempunyai awalan gl(cth glLineWidth). Ambil perhatian bahawa fungsi perpustakaan teras mempunyai berbilang versi, membolehkan anda menentukan parameter atau tetapan yang dikehendaki dalam apa jua cara yang anda suka. Lihat bantuan untuk fungsi dalam keluarga glColor*. Ternyata anda boleh menetapkan warna semasa dalam 32 cara. Sebagai contoh, fungsi:

Tidak sah glColorSb(GLbyte merah, GLbyte hijau, GLbyte biru);

Mentakrifkan warna menggunakan tiga komponen jenis GLbyte dan fungsi:

Tidak sah glColor4dv (const GLdouble *v);

Menentukannya menggunakan alamat tatasusunan empat komponen.

Dengan mengambil kira pilihan ini, perpustakaan teras mengandungi lebih daripada 300 arahan. Di samping itu, anda boleh menyambungkan perpustakaan utiliti GLU32.LIB yang melengkapkan kernel utama. Terdapat fungsi untuk mengawal tekstur, mengubah koordinat, menjana sfera, silinder dan cakera, penghampiran spline lengkung dan permukaan ( NURBS - B-Spline Rasional Tidak Seragam), serta pengendalian ralat. Satu lagi, tambahan ( bantu) perpustakaan GLAUX.LIB membenarkan dengan cara yang mudah buat tetingkap Windows, paparkan beberapa objek SD, kendalikan acara input dan urus proses latar belakang. Malangnya, perpustakaan ini tidak didokumenkan. Syarikat Microsoft Ia tidak disyorkan untuk menggunakannya untuk membangunkan projek komersil, kerana ia mengandungi kod gelung pemprosesan mesej yang mana mustahil untuk memasukkan pemprosesan mesej sewenang-wenangnya yang lain.

Catatan
Jenis GLbyte adalah bersamaan dengan jenis aksara yang ditandatangani, dan GLdouble adalah bersamaan dengan jenis berganda. Jenis sendiri digunakan untuk memudahkan mudah alih ke platform lain. Kami menyediakan senarai jenis OpenGL di bawah. Komponen warna keempat menentukan ketelusan warna, iaitu bagaimana warna latar belakang digabungkan dengan warna imej. Sesetengah arahan OpenGL mempunyai v pada penghujungnya, yang menunjukkan bahawa hujah haruslah alamat tatasusunan (vektor). Vektor dalam matematik ialah jujukan nombor (koordinat) yang secara unik mentakrifkan unsur ruang vektor. Banyak arahan mempunyai berbilang versi, akhirnya membolehkan anda menentukan vektor dengan cara yang berbeza
.

Kira-kira dua puluh fungsi Windows GDI dicipta khusus untuk berfungsi dengan OpenGL. Kebanyakannya mempunyai awalan wgl(akronim untuk Windows GL). Fungsi ini adalah analog daripada fungsi yang diawali dengan glx, yang menyambungkan OpenGL ke platform Sistem tetingkap X. Akhir sekali, terdapat beberapa fungsi Win32 untuk mengawal format piksel dan buffer berganda. Ia hanya terpakai pada tetingkap OpenGL khusus.

Anda sedang membaca tutorial OpenGL pertama saya!

Sebelum anda mula mempelajari OpenGL itu sendiri, nampaknya saya adalah lebih baik untuk memberitahu anda cara menyusun kod, menjalankannya, dan yang paling penting, cara mencuba kod sumber yang diberikan dalam pelajaran ini.

Apa yang anda perlu tahu

Pelajaran ini ditujukan kepada pembaca tanpa pengetahuan khusus tentang pengaturcaraan. Sudah tentu, pengetahuan tentang mana-mana bahasa pengaturcaraan (C, Java, Lisp, JavaSript) akan menjadi tambahan yang besar, tetapi ini tidak diperlukan, anda hanya perlu mempelajari dua subjek pada masa yang sama - grafik dan pengaturcaraan 3D.

Semua kod dalam pelajaran ini ditulis dalam C++ dalam gaya yang paling mudah. Tiada templat, kelas atau aritmetik penunjuk. Oleh itu, melihat kod, anda boleh memahami apa yang dilakukannya, walaupun anda hanya biasa dengan JavaSript.

Lupakan semua yang anda tahu tentang OpenGL 1/2

Pelajaran ini menganggap bahawa anda tidak tahu apa-apa tentang grafik 3D. Tetapi jika anda telah membaca tutorial OpenGL dan terjumpa sesuatu seperti glBegin(), maka lupakannya. Di sini kita akan mengkaji OpenGL 3 dan 4, dan apa yang anda baca terpakai pada OpenGL 1 atau 2. Oleh itu, saya syorkan anda melupakan semua yang anda tahu sebelum ini, jika tidak, otak anda akan mula cair daripada ketidakkonsistenan.

Membina projek

Kod daripada pelajaran ini boleh disusun untuk Windows dan Linux. Untuk mula menyusun kod untuk mana-mana platform, anda perlu melakukan perkara berikut:

  1. Kemas kini pemacu untuk kad video anda!! Saya memberi amaran kepada anda :)
  2. Muat turun pengkompil jika anda belum memilikinya.
  3. Pasang CMake
  4. Muat turun sumber pelajaran siap sedia.
  5. Hasilkan projek menggunakan CMake
  6. Pasang projek.
  7. Eksperimen dengan kod untuk lebih memahami perkara yang berlaku di sana.

Di bawah saya telah memberikan penerangan yang lebih terperinci mengenai projek pemasangan untuk setiap platform. Tetapi bergantung pada versi OS, tangkapan skrin mungkin berbeza sedikit daripada apa yang akan muncul pada skrin anda, tetapi secara umum, semuanya sepatutnya lebih kurang sama.

Perhimpunan untuk Windows


Bina untuk Linux

Terdapat sejumlah besar variasi Linux yang berbeza di dunia, jadi saya tidak mahu memberikan contoh memasang projek untuk setiap satu. Jika sesuatu tidak menjadi seperti yang diterangkan di bawah, baca dokumentasi atau cari di Internet.

  1. Pasang pemandu terkini ke kad video anda. Saya sangat mengesyorkan pemacu bukan sumber terbuka. Mereka tidak disertakan dengan GNU, tetapi selalunya berfungsi dengan lebih baik. Jika binaan Linux anda tidak menyediakan pemasang automatik, cuba baca panduan Ubuntu.
  2. Pasang pengkompil dengan semua perpustakaan yang diperlukan dan alatan. Berikut ialah senarai perkara yang anda perlukan: cmake make g++ libx11-dev libgl1-mesa-dev libglu1-mesa-dev libxrandr-dev libxext-dev. Gunakan sudo apt-get install ***** atau su /yum install ******
  3. Muat turun sumber contoh dan nyahzipnya ke dalam folder, contohnya ~/Projects/OpenGLTutorials/
  4. Pergi ke ~/Projects/OpenGLTutorials/ dan masukkan arahan berikut:
  • mkdir membina
  • binaan cd
  • cmake..
  1. Jika arahan sebelumnya berjaya dilaksanakan, fail make akan dibuat dalam folder binaan/
  2. masukkan "buat semua" dan selepas ini semua contoh dan kebergantungan mereka akan disusun. Jika tiada kesilapan, maka bersedia fail boleh laku akan diletakkan dalam folder ~/Projects/OpenGLTutorials/

Saya sangat suka menggunakan IDE QtCreator. IDE ini boleh berfungsi dengan CMake di luar kotak dan menyediakan banyak barangan lain, seperti penyahpepijatan, autolengkap, dsb.

Arahan untuk membina projek dalam QtCreator:

1. Dalam QtCreator klik Fail->Alat->Pilihan->Kompil&Laksanakan->CMake

2. Tentukan laluan ke CMake. Ini kemungkinan besar akan menjadi /usr/bin/cmake

3. Fail->Buka Projek dan pilih tutorial/CMakeLists.txt

4. Tentukan folder binaan, folder sebaiknya berada di luar folder tutorial.

5. Tetapkan secara pilihan –DCMAKE_BUILD_TYPE=Nyahpepijat dalam medan pilihan.

6. klik pada tukul di bawah. Selepas ini, contoh boleh dijalankan dari folder tutorial/

7. Untuk menjalankan contoh daripada QtCreator, pilih Projects ->Execution parameters ->Working Directory , dan pilih direktori di mana tekstur dan model shader berada. Untuk tutorial 2 ia akan menjadi ~/opengl -tutorial /tutorial02_red_triangle/

Contoh Larian

Setelah projek disusun, aplikasi boleh dilancarkan terus dari direktori.
Jika anda perlu menjalankan contoh terus daripada IDE, gunakan arahan di atas untuk menetapkan direktori kerja dengan betul.

Bagaimana untuk mengambil pelajaran ini

Setiap pelajaran disertakan kod sumber dan data. Semua fail ini boleh didapati dalam direktori tutorialXX/ yang sepadan.

Tetapi saya mengesyorkan agar anda tidak mengubah apa-apa dalam fail ini, ia adalah untuk rujukan sahaja. Lebih baik bermain di taman permainan/taman permainan.cpp dan ubah apa sahaja yang anda mahukan di sana. Jika anda memecahkan sesuatu dan tidak dapat memulihkannya semula, anda boleh memulangkan fail ini hanya dengan menyalinnya daripada mana-mana pelajaran lain.

Semasa anda membaca tutorial ini, anda akan melihat bit kod di mana-mana sahaja. Jangan ragu untuk menyalinnya ke taman permainan.cpp untuk melihat mereka beraksi - percubaan sentiasa bagus. Saya akan katakan sekali lagi, jangan hanya membaca. kod sedia, dan cuba melancarkannya. Anda tidak akan belajar banyak dengan hanya membaca kod sumber. Walaupun dengan tampalan salinan mudah, anda akan mendapat baldi masalah anda sendiri, menyelesaikan yang anda akan mendapat pengalaman yang diperlukan.

Membuka tingkap

Akhirnya! OpenGL!

Walaupun, anda perlu menunggu sedikit lagi. Dalam semua pelajaran, operasi 3D akan dilakukan pada tahap yang sangat rendah, jadi tiada keajaiban untuk anda. Walau bagaimanapun, bekerja dengan tetingkap sistem dan mesej tidak menarik dan membosankan, jadi kami akan membiarkan perpustakaan GLFW melakukan kerja kotor untuk kami. Jika anda benar-benar mahu, anda boleh menggunakan Win32 Api untuk Windows atau API X11 untuk Linux, atau gunakan sesuatu yang lain seperti SFML, FreeGLUT, SDL, ... baca halaman pautan.

Baiklah, mari kita mulakan. Mari kita mulakan dengan fakta bahawa kita perlu menyambung kebergantungan. Oleh kerana kami perlu mengeluarkan mesej ke konsol, kami akan menulis perkara berikut:

// Menyambung pengepala standard

#termasuk

#termasuk

Kemudian kita sambungkan GLEW

// Kita tidak boleh lupa itu GLEW mesti disambungkan sebelum ini gl . h atau glfw . h

#termasuk

Kemudian kita sambungkan GLFW. Perpustakaan ini akan melakukan semua keajaiban pengurusan tingkap.

#termasuk

hidup di fasa ini kami tidak memerlukan perpustakaan ini, tetapi ia mengandungi fungsi matematik dan kami akan memerlukannya tidak lama lagi. Tiada keajaiban dalam GLM, dan jika anda benar-benar mahu, anda boleh menggunakan mana-mana perpustakaan lain untuk bekerja dengan matriks dan vektor. Kami menyertakan "menggunakan ruang nama" untuk menulis "vec3" dan bukan "glm::vec3"

#termasuk

menggunakan ruang nama glm;

Jika anda menyalin kepingan kod ini ke dalam playground.cpp, pengkompil akan mula mengadu bahawa tiada fungsi main(). Jadi mari kita tambah:

int utama())(

Adalah lebih baik untuk memulakan GLFW terlebih dahulu:

// Mulakan GLFW

jika(!glfwInit())

{

fprintf(stderr, "Gagal untuk memulakan GLFW\n");

pulangan -1;

}

Sekarang mari buat tetingkap OpenGL kami:

glfwOpenWindowHint( GLFW_ FSAA_ SAMPEL, 4); // 4 xmelicinkan

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); //kami diperlukan OpenGL 3.3

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // kami Tidak diperlukan tua OpenGL

// Mari buka tetingkap dan buat konteks

if(!glfwOpenWindow(1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW))

{

fprintf(stderr, "Gagal membuka tetingkap GLFW\n");