Saya baru mengenal dunia 3D OpenGL / DirectX dan saya mengetahui bahwa spesifikasi OpenGL 4.1 dan GLSL baru saja dirilis hari ini.
Seorang teman saya memberi saya Buku Merah untuk OGL v2.1 tetapi, sejauh yang saya baca, 3.x dan 4.x sangat berbeda dari 2.x dan banyak hal sudah tidak digunakan lagi sekarang.
Dapatkah saya menggunakan buku ini untuk mulai mempelajari dasar-dasar 3D dan CG atau lebih baik menemukan salinan yang lebih baru?
Jawaban:
Di saat-saat seperti ini saya selalu menuju ke Survei Perangkat Keras Steam: http://store.steampowered.com/hwsurvey/ - Anda akan melihat bahwa penetrasi pasar sistem kelas DX10 / 11 hampir mencapai 80%; ini secara umum setara dengan GL3.3 atau lebih tinggi. 80% ini terbatas untuk pengguna Vista / 7 - tambahkan GPU DX10 / 11 dengan XP dan Anda naik menjadi lebih dari 90%.
Ingatlah bahwa kita berbicara tentang lebih banyak pemain hardcore di sini, Anda kemudian harus mulai memikirkan audiens target Anda. Apakah ini orang yang ingin Anda targetkan? Apakah Anda membidik mereka yang memiliki perangkat keras downlevel lebih banyak? Bagaimana dengan grafis Intel? Bagaimana dengan pengguna Mac dan Linux? Ini semua adalah pertanyaan yang perlu Anda jawab sendiri, jadi pedoman umum yang umum adalah yang terbaik yang akan Anda dapatkan.
Selain itu, Anda perlu mempertimbangkan fakta bahwa jika Anda mulai belajar hari ini dengan maksud mengirimkan sesuatu, Anda sedang melihat periode minimum satu tahun sebelum Anda tiba di sana (kecuali jika kita sedang berbicara tentang kasus yang benar-benar sepele / sederhana). Dengan tren peningkatan kemampuan gfx yang terus berlanjut, kami sedang mendekati mendekati 100% penyerapan perangkat keras GL3.3 + saat itu.
Kemudian faktor dalam hal itu dengan GL2.1 atau lebih rendah Anda akan belajar dan menggunakan banyak omong kosong tua yang kasar, bahkan jika Anda membatasi diri Anda pada shader dan VBO subset dari GL2.1 (versi GLSL downlevel tidak menyenangkan untuk digunakan , dan streaming VBO semuanya tidak dapat digunakan tanpa GL_ARB_map_buffer_range) - GL3.3 + telah memperkenalkan cara yang jauh lebih baik (dan lebih banyak performan) dalam menangani banyak hal, Anda akan menggunakan perangkat keras pemain dengan lebih baik (dan mereka akan berterima kasih kepada Anda untuk itu) dan Anda akan menghabiskan lebih banyak waktu menulis kode produktif daripada melawan API yang benar-benar tidak ingin bekerja sama dengan Anda.
Dan tentu saja ada situasi pengemudi yang ditakuti. Fakta yang sulit tetapi sebenarnya adalah bahwa driver GL pada Windows berada dalam keadaan menyesal - NV mendukung hal-hal yang tidak seharusnya, AMD tidak mendukung hal-hal yang seharusnya, dan dengan Intel Anda benar-benar perlu membatasi diri Anda pada fungsi GL yang ada setara di D3D. Semakin baru GL_VERSION, semakin besar kemungkinan Anda akan menemukan bug driver, tetapi untuk GL3.3 segalanya cukup stabil sekarang.
Jadi rangkumannya adalah, dengan tidak adanya info lain (audiens target, dll), saya menargetkan GL3.3 sebagai garis dasar (mungkin menarik fungsionalitas dari GL_VERSIONs yang lebih tinggi di mana tersedia dan di mana itu tidak mengganggu basis kode terlalu banyak) kecuali ada alasan yang sangat spesifik dan teridentifikasi secara definitif untuk menjadi lebih rendah (dan saya ingin benar-benar 100% yakin akan hal itu daripada menggunakan gagasan yang samar tentang " tetapi bagaimana dengan mereka yang memiliki perangkat keras yang lebih tua "). Dalam kasus terakhir saya tidak akan pergi di bawah GL2.1, dan saya akan mencari untuk menarik sebanyak mungkin fungsi 3.x bahkan saat itu.
sumber
Saya akan menyarankan menempel dengan persimpangan 2,1 dan 3. Masih banyak perangkat keras dan driver yang hanya mendukung OpenGL 2.1, tetapi praktik didorong oleh OpenGL 3 inti yang lebih baik. Tutorial ini adalah tempat yang cukup baik untuk memulai (mengajarkan OpenGL 2.0 tanpa fitur yang sudah usang dalam 3).
sumber
Saya akan mengatakan itu tidak berguna.
Mengapa? Nah, sementara seluruh dunia mendukung OpenGL 3.x dan 4.0, Mac OS X masih hanya mendukung OpenGL 2.1. Dan, OpenGL ES, yang digunakan pada sebagian besar, jika tidak semua, platform portabel, masih banyak didukung di semua versi: 1.0, 1.1, dan 2.0; yang kira-kira sebanding dengan OpenGL 1.4, 1.5, dan 2.1, masing-masing.
Jadi sampai OpenGL ES 1.0 menghilang sepenuhnya dari muka bumi, mengetahui OpenGL 2.x tidak akan sia-sia.
Itu tidak berarti tidak ada nilai dalam menggunakan OpenGL 3.x atau 4.0 pada platform yang mendukungnya, tentu saja.
Pembaruan: Pada rilis Mac OS X Lion (10.7), profil OpenGL 3.2 Core sekarang didukung pada Mac. Rilis ini mencela sebagian besar OpenGL 1.x untuk menyederhanakan API. Pengguna OS X versi lama (dan grafis Intel kelas bawah) masih terbatas pada OpenGL 2.0 dan 2.1. Mengetahui OpenGL 2.x masih berguna, dan akan tetap demikian untuk beberapa waktu.
sumber
Jawaban mh01 mencakup sebagian besar dasar-dasarnya, jadi saya akan menambahkan beberapa pendukung.
OpenGL ES
Mari kita bicara tentang ES 2.0 vs. desktop GL 2.1 vs. desktop GL 3.3. Untuk tujuan diskusi ini, istilah "GL XY" akan merujuk ke desktop OpenGL versi XY, sedangkan "ES XY" akan merujuk ke OpenGL ES XY
Secara struktural , ES 2.0 memiliki lebih banyak kesamaan dengan core GL 3.3 dibandingkan dengan GL 2.1. GL 3.3 dan ES 2.0 keduanya berbasis shader murni. Keduanya berbasis objek buffer murni. Dll. GL 2.1 memiliki banyak perangkap kinerja dan kode yang akan membuatnya mudah untuk menulis aplikasi GL 2.1 yang tidak mudah dibawa-bawa portabel ke ES 2.0.
Namun, dalam hal sintaks bahasa shading , GLSL ES 1.00 (pemetaan ke ES 2.0) jauh lebih mirip GL 2.1 GLSL daripada GL 3.3. Kata kunci
attribute
danvarying
tidak ada di 3,3 inti; menggunakanin
danout
, yang jauh lebih konsisten dan masuk akal ketika Anda berurusan dengan lebih dari 2 tahap shader (itulah sebabnya ES 3.0 mengadopsi sintaks GL 3.3).Sangat mudah untuk memetakan konsep - konsep yang dipelajari dalam GL 3.3 hingga ES 2.0. Jadi, jika Anda mempelajari GL 3.3 untuk berbagai alat untuk melakukannya, Anda akan mengerti cara bekerja di dunia ES 2.0. Anda harus mencari tahu di mana subset berada, tentu saja (yaitu: hal-hal yang tidak dapat dilakukan oleh GL 3.3 yang tidak dapat dilakukan ES 2.0), tetapi konsep-konsepnya sama.
Memetakan sintaks GLSL, sehingga Anda dapat menyalin shader dari satu ke yang lain, sedikit lebih sulit. Tapi sungguh, yang diperlukan hanyalah beberapa definisi di tempat yang tepat. Juga, GLSL 3.30 memiliki beberapa fitur kompatibilitas ES, seperti
highp
dan sebagainya (yang tidak melakukan apa-apa di desktop GLSL).Jadi, Anda mendapatkan sesuatu untuk ES 2.0 saat belajar dari GL 3.3 bukannya GL 2.1.
sumber
Untuk gim yang tidak membutuhkan perubahan yang lebih besar untuk OpenGL hanya terpapar di versi yang lebih baru, hanya menggunakan 3.x + membatasi Anda ke seri nvidia 8 dan ke atas (tidak yakin pada vendor grafis lain yang Anda ingin melihat itu). Jadi, jika Anda tidak menggunakan fitur 3.x +, Anda hanya membuat batas artifisial, menghentikan orang dengan kartu grafis yang lebih tua, tetapi lebih kuat dari memainkan game Anda.
Untuk alasan ini, saya sangat merekomendasikan mempelajari subset maju yang kompatibel, dan versi yang lebih baru, lalu memilih versi terendah yang dapat mendorong permainan Anda secara efektif. Kamu bisa
Saya juga akan mencatat dalam menanggapi pertanyaan lain bahwa OpenGL: ES 2.0 menghapus pipa fungsi tetap, jadi itu lebih setara dengan 3.0 dari 2.1. Juga selalu mendukung fitur yang berbeda per versi gl yang didukung saat runtime.
sumber
Saya akan mengatakan itu aman untuk mempelajari OpenGL menggunakan Buku Merah Anda, abaikan saja hal-hal yang sudah usang dalam versi yang lebih baru (seperti glBegin (), glEnd () - gunakan VBO sebagai gantinya). Sebagian besar fungsi dalam versi yang lebih baru sudah tersedia sebelum melalui ekstensi.
sumber
Saya sebagian besar setuju dengan thbusch. Tapi saya tidak akan sepenuhnya mengabaikan API yang sudah usang: ada terlalu banyak kode di luar sana yang menggunakannya. Saya akan membayar mereka jauh lebih sedikit perhatian. Tidak ada gunanya, misalnya, dalam belajar glBegin (), glEnd () cukup menyeluruh untuk menulis kode Anda sendiri menggunakannya. Tetapi Anda harus mengenali mereka ketika Anda melihatnya, dan memiliki beberapa gagasan tentang apa yang mereka lakukan.
Masih perlu membaca seluruh Buku Merah setidaknya sekali, bahkan jika Anda tidak membuat kode sampel dan melakukan latihan yang mencakup fitur-fitur yang dihentikan pada OpenGL 3.x.
sumber
Jawaban singkatnya:
Tidak. Mempelajari OpenGL 2.1 adalah ide yang bagus, bahkan hari ini, selama Anda mempelajari "bagian-bagian yang baik".
Jawaban Panjang:
OpenGL pada dasarnya dapat dibagi dalam dua bagian: "Bagian yang baik" dan "Fungsi warisan".
Jujur, saya tidak melihat banyak manfaat dalam mempelajari fungsi warisan ("fungsi tetap"). Namun, sebagian besar OpenGL 2.1 (bagian yang baik) masih tersedia saat ini dengan perubahan yang relatif kecil.
Dengan demikian, mempelajari beberapa bagian OpenGL 2.1 dapat bermanfaat. Secara khusus, OpenGL ES 2 sangat populer akhir-akhir ini, dan ES 2 sebagian besar (tetapi tidak persis) merupakan bagian dari OpenGL 2.1. Untuk pemrograman 3D di telepon pintar, OpenGL ES 2 adalah suatu keharusan.
Jadi apa yang "baik"? Pada dasarnya apa pun yang ada di OpenGL 3.x "profil inti" (sebagai lawan dari "profil kompatibilitas") dan / atau di OpenGL ES 2.
glLoadIdentity
fungsi semacam itu sudah usang dan harus dihindariglLightfv
dan fungsi lampu fungsi tetap lainnya harus dihindari.glBegin
,glVertex
,glColor
,glEnd
: Hindari mereka. Mungkin baik untuk eksperimen cepat, tetapi ada cara lain yang lebih baik untuk melakukan hal yang sama.Pertanyaan tempat saya mengeposkan jawaban ini ternyata merupakan duplikat, jadi saya memposting ulang di sini.
sumber
Saya tidak percaya itu ide yang buruk. Banyak konsep GL mencakup semua versi OpenGL dan pada akhirnya akan tetap membantu Anda. Saya memiliki sejumlah buku OpenGL dari 10 tahun yang lalu yang masih membantu hari ini. Saya akan mengatakan bahwa jika Anda baru di OpenGL dan ada beberapa buku yang lebih baik yang lebih tua, Anda akan belajar banyak dan kodenya harus tetap berfungsi. Sebagian besar OpenGL kompatibel ke belakang (saya percaya).
sumber
Saya menyarankan agar Anda mempelajari hal-hal modern terlebih dahulu dan hanya berpura-pura bahwa barang warisan tidak ada sampai Anda membutuhkannya.
Hal-hal yang kedaluwarsa dapat berguna dalam beberapa kasus misalnya jika Anda mencoba memprogram untuk sesuatu yang hanya mendukung OpenGL 1.5 atau lebih tua (dapat ditemukan pada netbook jelek dan sistem MacOS lama), OpenGL ES 1.x (iPhone lama dan Android sebelum 1.6), atau OpenGL SC (Subset Kritis Saftey jika Anda memprogram tampilan pada jet fighter). Minecraft misalnya dibangun terhadap OpenGL 1.3 sehingga dapat mendukung perangkat keras yang sangat lama (tetapi bahkan yang memiliki opsi 'lanjutan').
Ini juga bisa berguna jika Anda hanya ingin mendapatkan piksel pada layar dan tidak peduli melakukannya dengan cara yang benar.
Berguna untuk mengandalkan beberapa fitur yang dilakukan OpenGL secara default saat mempelajari seperti menyiapkan viewport -1.0 hingga 1.0 dan rendering tanpa shader. Ini memungkinkan Anda untuk belajar tanpa harus melakukan semuanya dalam satu waktu.
Tapi selain itu harus dilewati jika memungkinkan.
Saya sarankan Anda memeriksa jawaban saya di sini dan di sini untuk informasi lebih lanjut.
sumber