Cara Membuat Kubus di OpenGL (dengan Gambar)

Daftar Isi:

Cara Membuat Kubus di OpenGL (dengan Gambar)
Cara Membuat Kubus di OpenGL (dengan Gambar)

Video: Cara Membuat Kubus di OpenGL (dengan Gambar)

Video: Cara Membuat Kubus di OpenGL (dengan Gambar)
Video: Cara Install Windows (XP, 7, 10) dan Linux (Ubuntu, Kali, Mint) Menggunakan VirtualBox 2024, April
Anonim

OpenGL adalah alat pemrograman 3D yang kuat yang digunakan untuk menggambar adegan tiga dimensi yang kompleks dari primitif sederhana. Artikel ini akan mengajari Anda cara menggambar kubus sederhana yang dapat Anda putar untuk dilihat dalam tiga dimensi!

Untuk proyek ini, Anda memerlukan editor kode dan pengetahuan tentang pemrograman C.

Langkah

Bagian 1 dari 3: Pengaturan Awal

1994315 1 1
1994315 1 1

Langkah 1. Instal OpenGL Untuk memulai, ikuti langkah-langkah ini untuk menginstal OpenGL di sistem Anda

Jika Anda sudah menginstal OpenGL, serta kompiler C yang kompatibel, Anda dapat melewati langkah ini dan melanjutkan ke langkah berikutnya.

1994315 2 1
1994315 2 1

Langkah 2. Buat dokumen

Buat file baru di editor kode favorit Anda dan simpan sebagai mycube.c

1994315 3 1
1994315 3 1

Langkah 3. Tambahkan #include

Ini adalah termasuk dasar yang Anda perlukan untuk program Anda. Penting untuk disadari bahwa sebenarnya ada berbagai tambahan yang diperlukan untuk sistem operasi yang berbeda. Pastikan untuk menyertakan semua ini untuk memastikan program Anda serbaguna dan dapat dijalankan untuk pengguna mana pun.

    // Termasuk #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif

1994315 4 1
1994315 4 1

Langkah 4. Tambahkan prototipe fungsi dan variabel global

Langkah Anda selanjutnya adalah mendeklarasikan beberapa prototipe fungsi.

    // Fungsi Prototipe void tampilan(); batalkan kunci khusus(); // Variabel Global double rotate_y=0; putar ganda_x=0;

1994315 5 1
1994315 5 1

Langkah 5. Siapkan fungsi main()

    int main(int argc, char* argv){ // Inisialisasi GLUT dan memproses parameter pengguna glutInit(&argc, argv); // Meminta jendela warna asli dengan buffer ganda dengan Z-buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  • Pernyataan ini mengatur lingkungan Anda. Hal besar yang perlu diingat ketika menulis program OpenGL adalah Anda harus menanyakan semuanya. Ini mengharuskan Anda untuk memiliki pemahaman yang lebih baik tentang cara kerja program Anda dan apa yang perlu Anda sertakan untuk mendapatkan fungsionalitas yang Anda inginkan. Di baris ini, Anda akan mengatur tampilan dengan buffering ganda, warna RGB, dan buffer-Z.
  • Penyangga ganda adalah teknik yang digunakan dalam program grafis untuk menghilangkan masalah yang muncul karena bagaimana gambar digambar ke layar. Setiap kali Anda menggambar ulang adegan, tampilan harus dihapus terlebih dahulu kemudian informasi baru akan digambar. Tanpa buffering ganda, Anda akan melihat efek kedipan saat layar dihapus dan digambar ulang berulang kali.
  • Masalah ini diperbaiki dengan menambahkan buffer kedua untuk menggambar. Dengan metode ini, sebuah gambar digambar ke buffer pertama dan buffer itu ditampilkan kepada Anda. Bingkai berikutnya akan ditarik ke buffer kedua dan ketika itu selesai, kedua buffer akan bertukar tempat. Anda akan segera melihat buffer kedua, tetapi, tersembunyi dari kami, buffer pertama sedang dihapus dan digambar ulang dengan frame ketiga yang akan ditukar setelah selesai.
  • Anda juga ingin mengaktifkan warna RGB sistem di jendela Anda.
  • Penyangga Z adalah bagaimana Anda mendapatkan efek 3D yang Anda inginkan. OpenGL menggunakan sistem koordinat tiga dimensi dengan sumbu x, y dan z. Untuk memberikan efek bahwa suatu objek lebih dekat dengan Anda posisinya pada sumbu z meningkat, namun, untuk membuatnya tampak lebih jauh posisinya pada sumbu z dikurangi.
1994315 6 1
1994315 6 1

Langkah 6. Buat jendela

Langkah selanjutnya adalah membuat jendela di mana Anda akan menggambar kubus. Dalam tutorial ini, jendelanya disebut "Awesome Cube".

    // Buat jendela glutCreateWindow("Kubus Luar Biasa");

1994315 7 1
1994315 7 1

Langkah 7. Aktifkan uji kedalaman

OpenGL adalah bahasa yang ketat karena tidak menganggap fitur khusus apa pun diaktifkan. Agar program Anda dapat ditampilkan dengan benar dalam 3 dimensi menggunakan buffer-Z yang Anda lihat sebelumnya, Anda perlu aktifkan uji kedalaman. Saat Anda terus menjelajahi OpenGL, Anda akan menemukan banyak fitur yang perlu Anda aktifkan termasuk pencahayaan, tekstur, cull-facing dan banyak lagi.

    // Aktifkan uji kedalaman buffer-Z glEnable(GL_DEPTH_TEST);

1994315 8 1
1994315 8 1

Langkah 8. Tambahkan fungsi panggilan balik

Berikut adalah fungsi panggilan balik yang Anda buat untuk prototipe sebelumnya. Setiap kali melalui loop utama, fungsi-fungsi ini akan dipanggil. Fungsi tampilan menggambar ulang adegan berdasarkan perubahan apa pun pada variabel yang dibuat sejak panggilan sebelumnya. Fungsi specialKeys memungkinkan kita untuk berinteraksi dengan program.

    // Fungsi panggilan balik glutDisplayFunc(tampilan); glutSpecialFunc(Kunci khusus);

1994315 9 1
1994315 9 1

Langkah 9. Mulai MainLoop

Ini akan mengingat fungsi utama sampai Anda menutup program untuk memungkinkan animasi dan interaksi pengguna.

    // Berikan kontrol ke GLUT untuk event glutMainLoop(); // Kembali ke OS kembali 0; }

Bagian 2 dari 3: Fungsi tampilan()

1994315 10 1
1994315 10 1

Langkah 1. Pahami tujuan dari fungsi ini

Semua pekerjaan menggambar kubus Anda akan dilakukan dalam fungsi ini. Gagasan umum di balik kubus Anda adalah menggambar keenam sisi satu per satu dan menempatkannya di posisi yang sesuai.

Secara konseptual, setiap sisi akan digambar dengan mendefinisikan empat sudut dan membiarkan OpenGL menghubungkan garis dan mengisinya dengan warna yang Anda tentukan. Di bawah ini adalah langkah-langkah untuk melakukan ini

1994315 11 1
1994315 11 1

Langkah 2. Tambahkan glClear()

Langkah pertama yang perlu Anda ambil dalam fungsi ini adalah untuk hapus warna dan buffer Z. Tanpa langkah-langkah ini, gambar lama mungkin masih terlihat di bawah gambar baru dan objek yang digambar tidak akan berada di lokasi yang benar di layar.

    void display(){ // Bersihkan layar dan Z-buffer glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

1994315 12 1
1994315 12 1

Langkah 3. Tambahkan glBegin() dan glEnd()

OpenGL mendefinisikan objek sebagai kombinasi dari poligon yang berbeda. Menggunakan glMulai() perintah, Anda secara efektif meletakkan pensil yang akan menggambar bentuk. Untuk mengangkat pensil dan memulai bentuk baru, Anda harus menggunakan glEnd() memerintah. Dalam tutorial ini Anda akan menggunakan GL_POLYGON untuk menggambar setiap sisi kubus tetapi dimungkinkan untuk menggunakan opsi parameter lain seperti GL_LINE, GL_QUAD, atau GL_TRIANGLE untuk membuat bentuk lain.

  • Di sini Anda akan mulai dengan bagian depan kubus Anda. Nanti Anda akan menambahkan warna ke semua 6 sisi.
  • // Sisi multi-warna - FRONT glBegin(GL_POLYGON); // Simpul akan ditambahkan pada langkah berikutnya glEnd();

1994315 13 1
1994315 13 1

Langkah 4. Tambahkan glVertex3f()

Setelah Anda menyatakan bahwa Anda ingin memulai poligon Anda, Anda perlu tentukan simpulnya dari objek. glVertex memiliki beberapa bentuk tergantung pada apa yang ingin Anda lakukan dengan objek Anda.

  • Yang pertama adalah berapa banyak dimensi yang Anda kerjakan. 3 di atas di glVertex3f mengatakan Anda menggambar dalam 3 dimensi. Dimungkinkan juga untuk bekerja dalam 2 atau 4 dimensi. F di atas dalam glVertex3f mengatakan Anda bekerja dengan angka floating point. Anda juga dapat menggunakan celana pendek, bilangan bulat atau ganda.
  • Perhatikan bahwa titik-titik ini didefinisikan dalam a berlawanan arah jarum jam tata krama. Ini tidak terlalu penting saat ini tetapi ketika Anda mulai bekerja dengan pencahayaan, tekstur, dan cull-facing, ini akan menjadi sangat penting, jadi biasakan mendefinisikan poin Anda berlawanan arah jarum jam sekarang.
  • Tambahkan tambahkan simpul antara baris glBegin() dan glEnd().
  • // Sisi multi-warna - FRONT glBegin(GL_POLYGON); glVertex3f(-0.5, -0.5, -0.5); // P1 glVertex3f(-0.5, 0.5, -0.5); // P2 glVertex3f(0.5, 0.5, -0.5); // P3 glVertex3f(0.5, -0.5, -0.5); // P4 glEnd();

1994315 14 1
1994315 14 1

Langkah 5. Tambahkan glColor3f()

glColor bekerja dengan cara yang mirip dengan glVertex. Anda dapat mendefinisikan poin sebagai short, integer, double, atau float. Setiap warna memiliki nilai dari 0 hingga 1. Semua 0 membuat titik menjadi hitam dan semua 1 akan membuat titik menjadi putih. 3 di glColor3f() mengacu pada sistem warna RGB tanpa saluran alfa. Alfa warna menentukan transparansinya. Untuk mengubah level alpha, gunakan glColor4f() dengan parameter terakhir berupa nilai 0 hingga 1 untuk opaque menjadi transparent.

  • Saat Anda memanggil glColor3f() setiap simpul yang ditarik dari titik itu akan berwarna itu. Oleh karena itu, jika Anda ingin keempat simpul berwarna merah, cukup atur warnanya sekali kapan saja sebelum perintah glVertex3f() dan semua simpul akan berwarna merah.
  • Sisi depan yang ditentukan di bawah ini menunjukkan bagaimana mendefinisikan warna baru untuk setiap simpul. Ketika Anda melakukan ini, Anda dapat melihat properti yang menarik dari warna OpenGL. Karena setiap simpul poligon memiliki warnanya sendiri, OpenGL akan secara otomatis memadukan warna! Langkah selanjutnya akan menunjukkan bagaimana menetapkan empat simpul dengan warna yang sama.
  • //Sisi multi-warna - FRONT glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); // P1 berwarna merah glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5); // P2 berwarna hijau glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5); // P3 berwarna biru glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5); // P4 berwarna ungu glEnd();

1994315 15 1
1994315 15 1

Langkah 6. Tangani sisi lainnya

Cari tahu apa lokasi setiap simpul untuk lima sisi kubus lainnya, tetapi untuk kesederhanaan, ini telah dihitung untuk Anda dan termasuk dalam tampilan akhir () fungsi di bawah.

    // Sisi putih - KEMBALI glBegin(GL_POLYGON); glColor3f(1.0, 1.0, 1.0); glVertex3f(0.5, -0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); // Sisi ungu - KANAN glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 1.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glEnd(); // Sisi hijau - KIRI glBegin(GL_POLYGON); glColor3f(0.0, 1.0, 0.0); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); // Sisi biru - TOP glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, 0.5); glEnd(); // Sisi merah - BOTTOM glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); glFlush(); glutSwapBuffers(); }

  • Kami juga ingin menambahkan dua baris kode terakhir untuk fungsi ini. Ini adalah glFlush();

    dan glutSwapBuffers();

    yang memberi kami efek penyangga ganda yang Anda pelajari sebelumnya.

Bagian 3 dari 3: Interaktivitas Pengguna

1994315 16 1
1994315 16 1

Langkah 1. Tambahkan specialKeys()

Anda hampir selesai tetapi saat ini, Anda dapat menggambar kubus tetapi tidak memiliki cara untuk memutarnya. Untuk melakukan ini, Anda akan buat kunci khusus() berfungsi untuk memungkinkan kita menekan tombol panah dan memutar kubus!

  • Fungsi ini adalah alasan mengapa Anda mendeklarasikan variabel global rotate_x dan rotate_y. Saat Anda menekan tombol panah kanan dan kiri, rotate_y akan bertambah atau berkurang 5 derajat. Demikian pula, ketika Anda menekan tombol panah atas dan bawah, rotate_x akan berubah.
  • void specialKeys(kunci int, int x, int y) { // Panah kanan - meningkatkan rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_RIGHT) rotate_y += 5; // Panah kiri - kurangi rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_LEFT) rotate_y -= 5; else if (kunci == GLUT_KEY_UP) rotate_x += 5; lain jika (kunci == GLUT_KEY_DOWN) rotate_x -= 5; // Meminta pembaruan tampilan glutPostRedisplay(); }

1994315 17 1
1994315 17 1

Langkah 2. Tambahkan glRotate()

Pernyataan terakhir Anda adalah menambahkan pernyataan yang akan memutar objek Anda. Kembali ke fungsi display() dan sebelum sisi FRONT, tambahkan baris berikut:

    // Setel ulang transformasi glLoadIdentity(); // Putar saat pengguna mengubah rotate_x dan rotate_y glRotatef(rotate_x, 1.0, 0.0, 0.0); glRotatef(rotasi_y, 0.0, 1.0, 0.0); // Sisi multi-warna - DEPAN ….

  • Pertama perhatikan bahwa sintaks dari glRotatef() mirip dengan glColor3f() dan glVertex3f() tetapi selalu membutuhkan 4 parameter. Parameter pertama adalah derajat rotasi yang akan diterapkan. Tiga parameter berikutnya menentukan sumbu mana yang akan diputar dengan yang pertama adalah sumbu x, kedua adalah sumbu y, dan ketiga sebagai sumbu z. Saat ini Anda hanya perlu memutar pada sumbu x dan y.
  • Semua transformasi yang Anda tulis di program Anda membutuhkan baris yang mirip dengan ini. Secara konseptual, Anda dapat menganggap ini sebagai memutar objek Anda terhadap sumbu x dengan jumlah yang ditentukan oleh rotate_x dan kemudian berputar di sekitar sumbu y oleh rotate_y. Namun, OpenGL menggabungkan semua pernyataan ini menjadi satu transformasi matriks. Setiap kali Anda memanggil fungsi tampilan, Anda membangun matriks transformasi dan glLoadIdentity() memastikan bahwa Anda akan memulai dengan matriks baru di setiap lintasan.
  • Fungsi transformasi lain yang dapat Anda terapkan adalah glTranslatef() dan glScalef(). Fungsi-fungsi ini mirip dengan glRotatef() dengan pengecualian mereka hanya mengambil 3 parameter, x, y, dan z berjumlah untuk menerjemahkan atau menskalakan objek.
  • Untuk mendapatkan efek yang benar saat menerapkan ketiga transformasi ke satu objek, Anda perlu menerapkannya dalam urutan yang benar. Selalu tulis dalam urutan glTerjemahkan, glPutar, lalu glScale. OpenGL pada dasarnya menerapkan transformasi secara bottom up. Untuk memahami ini coba bayangkan seperti apa bentuk kubus 1x1x1 sederhana dengan transformasi jika OpenGL menerapkannya dari atas ke bawah dan jika OpenGL menerapkannya dari bawah ke atas.
1994315 18 1
1994315 18 1

Langkah 3. Tambahkan perintah berikut untuk menskalakan kubus sebesar 2 di sepanjang sumbu x, 2 di sepanjang sumbu y, putar kubus sebesar 180 derajat di sekitar sumbu y, dan terjemahkan kubus sebesar 0,1 di sepanjang sumbu x

Pastikan untuk mengatur ini serta perintah glRotate() sebelumnya dalam urutan yang benar seperti yang dijelaskan di atas. (Jika Anda tidak yakin, ini dilakukan dalam kode terakhir di akhir tutorial.)

    // Transformasi lainnya glTranslatef(0.1, 0.0, 0.0); glRotatef(180, 0.0, 1.0, 0.0); glScalef(2.0, 2.0, 0.0);

1994315 19 1
1994315 19 1

Langkah 4. Kompilasi dan jalankan kode Anda

Dengan asumsi Anda menggunakan gcc sebagai kompiler Anda, jalankan perintah ini dari terminal Anda untuk mengkompilasi dan menguji program Anda.

    Di Linux: gcc cube.c -o cube -lglut -lGL./ mycube Di Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube Di Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube

1994315 20 1
1994315 20 1

Langkah 5. Periksa kode lengkap Anda

Seharusnya seperti ini:

    // // File: mycube.c // Penulis: Matt Daisley // Dibuat: 25/4/2012 // Proyek: Kode sumber untuk Membuat Kubus di OpenGL // Deskripsi: Membuat jendela OpenGL dan menggambar kubus 3D / / Bahwa pengguna dapat memutar menggunakan tombol panah // // Kontrol: Panah Kiri - Putar Kiri // Panah Kanan - Putar Kanan // Panah Atas - Putar Atas // Panah Bawah - Putar Bawah // ------ -------------------------------------------------- -- // Termasuk // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Fungsi Prototipe / / -------------------------------------------------- --------- batal tampilan(); batalkan kunci khusus(); // ------------------------------------------------ ---------- // Variabel Global // ---------------------------------- ------------------------ putar ganda_y=0; putar ganda_x=0; // ------------------------------------------------ ---------- // display() Fungsi panggilan balik // -------------------- --------------------------- void display(){ // Bersihkan layar dan Z-buffer glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Setel ulang transformasi glLoadIdentity(); // Transformasi Lainnya // glTranslatef(0.1, 0.0, 0.0); // Tidak termasuk // glRotatef(180, 0.0, 1.0, 0.0); // Tidak termasuk // Rotate saat pengguna mengubah rotate_x dan rotate_y glRotatef(rotate_x, 1.0, 0.0, 0.0); glRotatef(rotasi_y, 0.0, 1.0, 0.0); // Transformasi Lainnya // glScalef(2.0, 2.0, 0.0); // Tidak termasuk // Sisi multi-warna - FRONT glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); // P1 berwarna merah glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5); // P2 berwarna hijau glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5); // P3 berwarna biru glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5); // P4 berwarna ungu glEnd(); // Sisi putih - KEMBALI glBegin(GL_POLYGON); glColor3f(1.0, 1.0, 1.0); glVertex3f(0.5, -0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); // Sisi ungu - KANAN glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 1.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glEnd(); // Sisi hijau - KIRI glBegin(GL_POLYGON); glColor3f(0.0, 1.0, 0.0); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); // Sisi biru - TOP glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.5); glVertex3f(0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, 0.5, 0.5); glEnd(); // Sisi merah - BOTTOM glBegin(GL_POLYGON); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5); glVertex3f(0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(-0.5, -0.5, -0.5); glEnd(); glFlush(); glutSwapBuffers(); } // ----------------------------------------------- ----------- // specialKeys() Fungsi Panggilan Balik // ------------------------------ ---------------------------- void specialKeys(kunci int, int x, int y) { // Panah kanan - tingkatkan rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_RIGHT) rotate_y += 5; // Panah kiri - kurangi rotasi sebesar 5 derajat jika (kunci == GLUT_KEY_LEFT) rotate_y -= 5; else if (kunci == GLUT_KEY_UP) rotate_x += 5; lain jika (kunci == GLUT_KEY_DOWN) rotate_x -= 5; // Meminta pembaruan tampilan glutPostRedisplay(); } // ----------------------------------------------- ----------- // fungsi utama // ------------------------------- --------------------------- int main(int argc, char* argv){ // Menginisialisasi GLUT dan memproses parameter pengguna glutInit(&argc, argv); // Meminta jendela warna asli buffer ganda dengan Z-buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Buat jendela glutCreateWindow("Kubus Luar Biasa"); // Aktifkan uji kedalaman buffer-Z glEnable(GL_DEPTH_TEST); // Fungsi panggilan balik glutDisplayFunc(tampilan); glutSpecialFunc(Kunci khusus); // Berikan kontrol ke GLUT untuk event glutMainLoop(); // Kembali ke OS kembali 0; }

Direkomendasikan: