OpenGL memiliki empat versi utama yang berbeda, tidak termasuk versi untuk perangkat seluler dan sistem tertanam (OpenGL | ES) dan Web via JavaScript (WebGL). Sama seperti Direct3D 11 memiliki cara yang berbeda dalam melakukan sesuatu daripada Direct3D 8, begitu juga OpenGL 3 memiliki cara yang berbeda dalam melakukan sesuatu daripada OpenGL 1. Perbedaan besar adalah bahwa versi OpenGL sebagian besar hanya add-on ke versi yang lebih lama (tetapi tidak sepenuhnya).
Di atas berbagai edisi dan versi OpenGL, OpenGL utama juga menambahkan konsep profil. Yaitu Profil Kompatibilitas (yang memungkinkan dukungan untuk API dari versi yang lebih lama) dan Profil Inti (yang menonaktifkan API lama itu). Hal-hal seperti glBegin
tidak berfungsi ketika Anda menggunakan Profil Inti tetapi akan ketika Anda menggunakan Profil Kompatibilitas (yang merupakan default).
Sebagai satu komplikasi besar lebih lanjut, beberapa implementasi OpenGL (seperti Apple, antara lain) hanya akan mengaktifkan fitur OpenGL yang lebih baru ketika Anda menggunakan Core Profile. Ini berarti Anda harus berhenti menggunakan API lama untuk menggunakan API yang lebih baru.
Anda kemudian berakhir dengan beberapa skenario yang sangat membingungkan untuk tutorial:
- Tutorialnya sudah tua dan hanya menggunakan API yang sudah tidak digunakan lagi.
- Tutorialnya baru dan ditulis dengan baik dan hanya menggunakan API yang kompatibel dengan Core.
- Tutorialnya baru tetapi membuat kesalahan dengan menganggap bahwa Anda bekerja dengan driver yang memungkinkan semua API dalam mode Kompatibilitas, dan secara bebas mencampur API baru dan lama.
- Tutorialnya adalah untuk edisi OpenGL yang berbeda seperti OpenGL | ES yang sama sekali tidak mendukung API lama, dalam versi apa pun.
Hal-hal seperti glBegin
adalah bagian dari apa yang kadang-kadang disebut API mode langsung. Ini juga sangat membingungkan karena tidak ada yang namanya mode dipertahankan dalam OpenGL dan "mode langsung" sudah memiliki definisi yang berbeda dalam grafik. Jauh lebih baik untuk merujuknya sebagai OpenGL 1.x API karena sudah usang sejak OpenGL 2.1.
1.x API OpenGL akan segera mengirimkan simpul ke pipa grafis kembali di masa lalu. Ini bekerja dengan baik ketika kecepatan perangkat keras yang membuat simpul kira-kira setara dengan kecepatan CPU menghasilkan data titik. OpenGL saat itu baru saja mengeluarkan rasterisasi segitiga dan tidak banyak lagi.
Hari-hari ini, GPU dapat mengunyah sejumlah besar simpul pada kecepatan yang sangat tinggi sambil melakukan transformasi verteks dan piksel yang canggih dan CPU bahkan tidak dapat mengikuti. Selain itu, antarmuka antara CPU dan GPU telah dirancang untuk perbedaan kecepatan ini yang berarti bahwa bahkan tidak mungkin untuk mengirimkan simpul ke GPU satu per satu lagi.
Semua driver GL harus ditiru glBegin
dengan mengalokasikan secara internal buffer verteks, menempatkan simpul-simpul yang dikirimkan bersama glVertex
ke buffer ini, dan kemudian mengirimkan seluruh buffer itu dalam panggilan draw tunggal saat glEnd
dipanggil. Overhead dari fungsi-fungsi ini jauh lebih besar daripada jika Anda baru saja memperbarui buffer vertex sendiri, itulah sebabnya beberapa dokumentasi akan (sangat keliru!) Menyebut buffer vertex sebagai "sebuah optimasi" (ini bukan optimasi; itu satu-satunya cara untuk benar-benar bicara dengan GPU).
Ada berbagai API lain yang telah usang atau usang di OpenGL selama bertahun-tahun. Yang disebut pipeline fungsi-tetap adalah bagian yang lain. Beberapa dokumentasi mungkin masih menggunakan pipa ini atau bergaul dengan pipa yang dapat diprogram. Pipeline fungsi tetap berasal dari masa lalu ketika kartu grafis mengkodekan semua matematika yang digunakan untuk membuat adegan 3D dan OpenGL API terbatas pada pengaturan beberapa nilai konfigurasi untuk matematika itu. Saat ini perangkat keras memiliki matematika hard-code yang sangat sedikit dan (seperti halnya CPU Anda) menjalankan program yang disediakan pengguna (sering disebut shader).
Sekali lagi driver harus meniru API lama karena fitur fungsi tetap tidak ada lagi pada perangkat keras. Ini berarti bahwa driver memiliki banyak shader kompatibilitas yang tertanam di dalamnya yang menjalankan matematika lama dari hari-hari fungsi tetap yang digunakan ketika Anda tidak memasok shader Anda sendiri. Fungsi OpenGL lama yang mengubah keadaan fungsi tetap lama (seperti API pencahayaan OpenGL lama) sebenarnya menggunakan fitur OpenGL modern seperti buffer seragam untuk mengumpankan nilai-nilai ini ke shaders kompatibilitas driver.
Driver yang mendukung kompatibilitas harus melakukan banyak pekerjaan di belakang layar hanya untuk mencari tahu ketika Anda menggunakan fitur usang ini dan memastikan bahwa Anda dapat menggabungkannya dengan fitur modern dengan lancar, yang menambah biaya overhead dan sangat menyulitkan pengemudi. Ini adalah salah satu alasan bahwa beberapa driver memaksa Anda untuk mengaktifkan Profil Inti untuk mendapatkan fitur yang lebih baru; itu sangat menyederhanakan internal driver mereka dengan tidak harus mendukung API lama dan baru yang digunakan secara bersamaan.
Banyak dokumentasi mungkin menyarankan Anda mulai dengan API lama hanya karena lebih mudah untuk memulai. Direct3D memecahkan masalah ini untuk pemula dengan menawarkan perpustakaan pendamping ( DirectX Tool Kit ) yang menyediakan API gambar yang lebih sederhana dan shader yang telah ditulis sebelumnya yang dapat secara bebas dicampur dengan penggunaan Direct3D 11 saat keahlian Anda tumbuh. Komunitas OpenGL yang lebih luas sebagian besar terjebak dengan Profil Kompatibilitas untuk pemula, sayangnya, yang bermasalah karena lagi-lagi ada sistem yang tidak memungkinkan Anda mencampur API OpenGL lama dengan yang lebih baru. Ada pustaka dan alat tidak resmi untuk rendering yang lebih sederhana pada OpenGL baru dengan berbagai tingkat fitur dan kasus penggunaan target dan bahasa ( MonoGame untuk pengguna .NET misalnya), tetapi tidak ada yang secara resmi disetujui atau disetujui secara luas.
Dokumentasi yang Anda temukan mungkin bukan untuk OpenGL tetapi mungkin untuk salah satu API serupa lainnya. OpenGL | ES 1.x memiliki fungsi tetap rendering tetapi tidak memiliki OpenGL 1.x API untuk pengiriman vertex. OpenGL | ES 2.x + dan WebGL 1+ tidak memiliki fitur fungsi tetap sama sekali dan tidak ada mode kompatibilitas mundur untuk API tersebut.
API ini terlihat sangat mirip dengan OpenGL utama; mereka tidak cukup kompatibel, tetapi ada ekstensi resmi untuk OpenGL yang didukung oleh beberapa (tidak semua) driver agar kompatibel dengan OpenGL | ES (yang menjadi dasar WebGL). Karena semuanya tidak cukup membingungkan sebelumnya.