OpenGL başlangıcını ekranın sol üst kısmına değiştirirken ne hakkında endişelenmem gerekir?


11

Kendi kendine eğitim için, SDL / OpenGL kullanarak C ++ 'da bir 2D platformer motoru yazıyorum. Başlangıçta sdltutorials.com ve lazyfoo.net'teki öğreticileri kullanarak saf SDL ile başladım, ancak şimdi bir OpenGL oluşturma bağlamı oluşturmak ve daha sonra OpenGL işlevleriyle (özellikle hemen modda öğreniyorum ancak VAO'lar / VBO'lar hakkında bilgi ediniyorum) SDL kullanıyorum ). SDL'yi yalnızca arayüz, ses vb. İçin kullanıyorum.

SDL, başlangıç ​​noktası ekranın sol üst köşesinde ve pozitif y ekseni aşağı bakacak şekilde bir koordinat sistemi kullanır. Bunu yansıtmak için OpenGL'deki ortografik projeksiyonumu ayarlamak kolaydır.

Doku koordinatlarının 0'dan 1'e kadar değerlere sahip sağ taraftaki bir sistem olduğunu biliyorum - işlemeden önce dokuyu dikey olarak çevirmek (yüklemeden önce dosyayı çevirin) doğru işleyen dokular verir ... ancak sonuçta fayans setleri kullanacağım ve problemleri hayal edebiliyorum.

Bunu yaparken renderleme konusunda nelere dikkat etmeliyim?

Herhangi bir tavsiye varsa veya bunu kendileri yapmışlarsa ve gelecekteki tuzaklara işaret edebilirlerse, bu harika olurdu, ancak gerçekten herhangi bir düşünce takdir edilecektir.


1
Oluşturmak için SDL mi kullanıyorsunuz (SDL'nin blitting işlevlerinde olduğu gibi) mi yoksa SDL'yi bir OpenGL oluşturma içeriği oluşturmak için mi, ardından oluşturmak için OpenGL işlevlerini mi kullanıyorsunuz?
Nicol Bolas

1
SDL OpenGL oluşturma içeriği oluşturmak için ve OpenGL işlevleri oluşturmak için kullanıyorum. Bunu soruda açıklığa kavuşturacağım.
türev

1
Belki bir fizik sistemi kullanacaksanız, hangi koordinat sistemini kullandığını (sağ elle veya solak, Y-UP veya Y-DOWN) daha iyi görün ve aynı şekilde kullanmaya devam edin. Tabii ki Gravity'yi ters çevirme gibi şeyler yapabilirsiniz, ama aynı şeyi thng'leri kolaylaştırmak için kullanmaya çalışacağım.
Gustavo Maciel

Yanıtlar:


8

"Bunu yaparken renderleme konusunda nelere dikkat etmeliyim?" - fazla değil. Koordinat sistemi sadece bir sözleşmedir, zor ve hızlı bir kural değildir ve bu yapılması gereken yasal ve geçerli bir şeydir. Sadece kendi kullanımınızda tutarlı olduğunuzdan emin olun ve her şey iyi çalışır.


Harika! Endişelenmem gereken tek şey öfke kıvamındaydı, ama bu benim için yeni bir bölge.
türev

1
Sevmeliyim ki eski Quake 1996'da bunu yaptı ve gayet iyi çalıştı.
Maximus Minimus

5

OpenGL ile 2B olarak çalışırken, genellikle başlangıç ​​olarak sol üst köşeyi kullanırım. Bu, aşağıdakilerle yapılabilir:

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

Bununla birlikte, menşei sol üste değiştirirken bazı tuzaklar vardır.

Bir kereden fazla karşılaştığım bir tuzak: glScissor()kırpma için kullanılan, her zaman sol alt koordinatları kullanır.

İmzası:

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

burada makas kutusunun sol alt köşesini x, ybelirtin .

Daha genel olarak, pencere koordinatlarında çalışan işlevlerin tümü başlangıç ​​noktası olarak sol alt köşeyi kullanır. Bu gibi işlevleri içerir gluProject, gluUnProject, glCopyPixelsvb

Ancak bazı işlevler konumlandırma için glDrawPixelskullanılır glRasterPosve nesne (yani dönüştürülmüş) koordinatlarınıglRasterPos kullanır .

Linux'ta çalışıyorsanız ve nasıl kullanacağınızı biliyorsanız man, burada OpenGL yönetimlerinin bir kopyasını almak isteyebilirsiniz: ftp://ftp.sgi.com/sgi/opengl/doc/ Onları gerçek zamanlı buluyorum- koruyucu.

Ayrıca, dokularda "yüklemeden önce dosyayı çevir" dediğini fark ettim. Bu gerekli değil. Görüntüyü yüklerken ters çevirmek yerine, görüntü oluştururken doku koordinatlarını çevirerek 1.0'dan 0.0'a gidin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.