Mengapa ada glMatrixMode di OpenGL?

Saya hanya tidak mengerti untuk apa glMatrixMode OpenGL.

Sejauh yang saya bisa lihat, ketika glMatrixMode(GL_MODELVIEW) dipanggil, diikuti oleh glVertex, glTranslate, glRotate dan sejenisnya, yaitu perintah OpenGL yang menempatkan beberapa objek di suatu tempat di ruang tersebut. Di sisi lain, jika glOrtho atau glFrustum atau gluProjection dipanggil (yaitu bagaimana objek yang ditempatkan dirender), ia memiliki panggilan sebelumnya sebesar glMatrixMode(GL_PROJECTION).

Saya kira apa yang saya tulis sejauh ini adalah sebuah asumsi dimana seseorang akan membuktikan bahwa saya salah, namun bukan poin menggunakan Mode Matriks yang berbeda justru karena ada jenis yang berbeda. fungsi gl: fungsi yang berkaitan dengan penempatan objek dan fungsi rendering objek?


person René Nyffenegger    schedule 30.12.2010    source sumber
comment
Perhatikan bahwa ini sekarang sudah tidak digunakan lagi dan Anda harus menggunakan shader dan seragam eksplisit saja, mulai dari OpenGL 3.1. Misalnya, OpenGL ES 2.0 tidak mendukung glMatrixMode() dan sejenisnya sama sekali. (Ya, tentu saja kecuali Anda memiliki banyak kode yang melakukan hal ini dan/atau perlu mendukung perangkat keras/driver lama.)   -  person Macke    schedule 31.12.2010
comment
Dan glVertex seharusnya dianggap tidak digunakan lagi mulai dari OpenGL 1.0 ke atas. :)   -  person Kos    schedule 31.12.2010
comment
Bila Anda menyebutkan sesuatu yang sudah usang, harap sebutkan juga pengganti modernnya, karena tanpa itu tidak banyak informasinya.   -  person SasQ    schedule 07.01.2015
comment
@Kos dari OpenGL 1.1. Alternatif pertama — glDrawArrays — baru muncul saat itu.   -  person Ruslan    schedule 06.07.2016


Jawaban (4)


Ini sederhana dan dapat dijawab dengan sangat singkat:

  • Merender simpul (seperti pada glVertex ) bergantung pada keadaan saat ini dari matriks yang disebut "matriks tampilan model" dan "matriks proyeksi",

  • Perintah glTranslatef, glPushMatrix, glLoadIdentity, glLoadMatrix, glOrtho, gluPerspective dan seluruh kelompoknya memengaruhi matriks saat ini (yang merupakan salah satu dari perintah di atas),

  • Perintah glMatrixMode memilih matriks (tampilan model atau proyeksi) yang dipengaruhi oleh perintah yang disebutkan di atas.

(Selain itu, ada juga matriks tekstur yang digunakan untuk koordinat tekstur, namun jarang digunakan.)

Jadi kasus penggunaan umum adalah:

  • memiliki matriks tampilan model yang aktif hampir sepanjang waktu,
  • kapan pun Anda harus menginisialisasi matriks proyeksi (biasanya di awal atau saat jendela diubah ukurannya, mungkin), alihkan aktif ke proyeksi, atur perspektif, dan kembali ke tampilan model.
person Kos    schedule 31.12.2010
comment
Anda harus selalu mengatur ulang (yaitu mengatur ulang yang baru) matriks proyeksi setiap kali Anda melewati tampilan penuh. Anda harus menggunakan beberapa proyeksi berbeda untuk aplikasi dunia nyata apa pun. Misalnya untuk merender HUD dalam game, Anda akan menggunakan proyeksi lain, selain untuk adegan sebenarnya. OpenGL tidak mengetahui inisialisasi selain mendapatkan konteksnya, jadi harap lupakan melakukan hal satu kali di suatu tempat, atau melakukan pola bodoh yang mengatur proyeksi di penangan reshape. - person datenwolf; 01.01.2011
comment
@datenwolf - Benar, tetapi push/popMatrix pada matriks proyeksi untuk overlay 2D juga berfungsi dengan baik, jadi perbedaannya tidak terlalu besar. - person Kos; 01.01.2011
comment
Anehnya adalah saya tidak dapat membayangkan bagaimana glOrtho atau gluPerspective dapat digunakan untuk hal lain selain matriks proyeksi, dan glTranslate, glRotate & transformasi lainnya digunakan untuk matriks proyeksi, jadi mengapa fungsi untuk menyiapkan proyeksi tidak memilih matriks proyeksi secara internal? Saya rasa, ini akan membuat pengguna tidak pusing dan lebih tahan terhadap orang bodoh. Fungsi-fungsi yang dapat dipanggil pada matriks mana pun, tetap dapat menggunakan pemilihan mode seperti sebelumnya. - person SasQ; 07.01.2015
comment
video ini membantu seseorang memahami representasi intuitif matriks proyeksi tampilan model. youtube.com/watch?v=uQNU5XICGvw - person bicepjai; 12.09.2015

Anda juga dapat menggunakan glRotate dan glTranslate untuk matriks proyeksi.

Juga: OpenGL mendukung transformasi tekstur dan warna. Jika Anda mengaktifkan fitur ini, misalnya Anda dapat memodifikasi koordinat tekstur suatu objek tanpa menulis ulang koordinat tekstur setiap frame (lambat).

Ini adalah fitur yang sangat berguna jika Anda ingin menggulirkan tekstur pada suatu objek. Yang harus Anda lakukan untuk ini adalah menggambar objek bertekstur, mengatur mode matriks ke GL_TEXTURE dan memanggil glTranslate untuk mengatur offset ke dalam tekstur.

person Nils Pipenbrinck    schedule 30.12.2010
comment
Selain itu, matriks tekstur proyektif digunakan dengan bayangan dan tekstur yang diproyeksikan (lampu sorot panggung, lampu depan, disko, proyektor film, dll) ... - person Macke; 31.12.2010

Seperti yang ditunjukkan Nils, Anda memiliki lebih banyak matriks daripada sekadar apa yang Anda sebutkan.

Saya akan menambahkan beberapa pemikiran:

  • Inti OpenGL (mulai 3.1 dan seterusnya) menghilangkan semua hal matriks sepenuhnya, begitu pula GL ES 2.0. Hal ini disebabkan oleh fakta bahwa program shader menghilangkan sebagian besar persyaratan agar program tersebut terekspos pada level GL (namun hal ini tetap nyaman). Anda kemudian hanya memiliki seragam, dan Anda harus menghitung nilainya sepenuhnya di sisi klien.

  • Ada lebih banyak titik masuk manipulasi matriks daripada yang Anda sebutkan. Beberapa di antaranya berlaku sama baiknya untuk proyeksi/tampilan model (glLoadIdentity/glLoadMatrix/glMultMatrix, Push/Pop), Mereka sangat berguna jika Anda ingin melakukan penghitungan matriks sendiri (misalnya karena Anda memerlukannya di tempat lain dalam aplikasi Anda).

person Bahbar    schedule 31.12.2010
comment
Menghilangkan semua hal matriks ini tidak terlalu akurat. Perkalian matriks masih merupakan cara menerapkan transformasi pada koordinat titik. Perbedaannya adalah bahwa ini bukan lagi fungsi tetap dalam pipeline, namun dikontrol sepenuhnya oleh shader yang dapat diprogram. - person Ben Voigt; 18.04.2014

Semua koordinat geometri mengalami beberapa transformasi linier secara berurutan. Meskipun transformasi linier apa pun dapat dinyatakan dengan satu matriks, sering kali Anda ingin memikirkan barisan transformasi dan mengedit barisan tersebut, dan jika Anda hanya memiliki satu matriks, Anda hanya dapat mengubah ujung barisan tersebut. Dengan menyediakan beberapa langkah transformasi, OpenGL memberi Anda beberapa tempat di tengah-tengah di mana Anda juga dapat mengubah transformasi tersebut.

Memanggil glMatrixMode sebelum memancarkan geometri tidak berpengaruh sama sekali. Anda memanggil glMatrixMode sebelum mengedit matriks transformasi, untuk menentukan di mana dalam urutan keseluruhan pengeditan tersebut muncul.

(Catatan: Melihat barisan tersebut lebih masuk akal jika Anda ingat bahwa translasi dan rotasi tidak bersifat komutatif, karena translasi mengubah pusat rotasi. Demikian pula translasi dan penskalaan tidak bersifat komutatif.)

person Ben Voigt    schedule 30.12.2010