Apa yang harus saya khawatirkan ketika mengubah asal OpenGL ke kiri atas layar?


11

Untuk pendidikan mandiri, saya sedang menulis mesin platformer 2D di C ++ menggunakan SDL / OpenGL. Awalnya saya mulai dengan SDL murni menggunakan tutorial di sdltutorials.com dan lazyfoo.net, tapi saya sekarang menggunakan SDL untuk membuat konteks rendering OpenGL dan kemudian membuat dengan fungsi OpenGL (mode khusus langsung tetapi saya belajar tentang VAOs / VBOs ). Saya hanya menggunakan SDL untuk antarmuka, audio, dll.

SDL menggunakan sistem koordinat dengan asal di kiri atas layar dan sumbu y positif mengarah ke bawah. Mudah untuk mengatur proyeksi ortografis saya di OpenGL untuk mencerminkan hal ini.

Saya tahu bahwa koordinat tekstur adalah sistem tangan kanan dengan nilai dari 0 hingga 1 - membalik tekstur secara vertikal sebelum rendering (well, balikkan file sebelum memuat) menghasilkan tekstur yang membuat dengan benar ... yang baik jika saya menggambar seluruh tekstur, tetapi pada akhirnya saya akan menggunakan tilesets dan bisa membayangkan masalah.

Apa yang harus saya khawatirkan dalam hal rendering ketika saya melakukan ini?

Jika ada yang punya saran atau mereka sudah melakukan ini sendiri dan bisa menunjukkan jebakan di masa depan, itu akan bagus, tetapi benar-benar ada pikiran yang akan dihargai.


1
Apakah Anda menggunakan SDL untuk merender (seperti pada fungsi blitting SDL), atau apakah Anda menggunakan SDL untuk membuat konteks render OpenGL, kemudian menggunakan fungsi OpenGL untuk render?
Nicol Bolas

1
Saya menggunakan SDL untuk membuat konteks render OpenGL dan menggunakan fungsi OpenGL untuk merender. Saya akan menjelaskan ini dalam pertanyaan.
turunannya

1
Mungkin jika Anda akan menggunakan sistem fisika, lebih baik lihat sistem koordinat yang digunakannya (tangan kanan atau tangan kiri, Y-UP atau Y-DOWN) dan tetap menggunakan yang sama. Tentu saja Anda dapat melakukan hal-hal seperti membalikkan Gravity, tetapi saya akan mencoba menggunakan hal yang sama untuk mempermudah.
Gustavo Maciel

Jawaban:


8

"Apa yang harus saya khawatirkan dalam hal rendering ketika saya melakukan ini?" - tidak banyak. Sistem koordinasi hanyalah sebuah konvensi, bukan aturan yang keras dan cepat, dan ini adalah hal yang sah dan sah untuk dilakukan. Pastikan bahwa Anda konsisten dalam penggunaan Anda sendiri dan semuanya akan berfungsi dengan baik.


Bagus! Saya memiliki firasat konsistensi diri adalah satu-satunya hal yang perlu saya khawatirkan, tetapi ini adalah wilayah baru bagi saya.
turunannya

1
Saya harus menambahkan bahwa Quake tua tersayang melakukan ini kembali pada tahun 1996 dan itu bekerja dengan baik.
Maximus Minimus

5

Ketika bekerja dalam 2D ​​dengan OpenGL, saya sering menggunakan sudut kiri atas sebagai asal. Ini dapat dilakukan dengan:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

Namun, ada beberapa jebakan saat mengubah asal ke kiri atas.

Satu perangkap yang pernah saya temui lebih dari sekali:, glScissor()yang digunakan untuk kliping, selalu menggunakan koordinat kiri bawah.

Tanda tangannya adalah:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

di mana x, ymenentukan sudut kiri bawah kotak gunting.

Lebih umum, semua fungsi yang beroperasi di koordinat jendela semua menggunakan kiri bawah sebagai asal. Ini termasuk fungsi seperti gluProject, gluUnProject, glCopyPixels, dll

Tetapi beberapa fungsi seperti glDrawPixelspenggunaan glRasterPosuntuk penentuan posisi, dan glRasterPosmenggunakan koordinat objek (yaitu transformasi) .

Jika Anda menjalankan di Linux, dan tahu cara menggunakannya man, Anda mungkin ingin mengambil salinan manual OpenGL di sini: ftp://ftp.sgi.com/sgi/opengl/doc/ Saya menemukan mereka waktu nyata- penghemat.

Saya juga melihat Anda mengatakan "balikkan file sebelum memuat" tekstur. Ini tidak perlu. Alih-alih membalik gambar saat memuatnya, cukup balikkan koordinat tekstur untuk beralih dari 1,0 ke 0,0 saat rendering.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.