Bagaimana cara menggambar tekstur resolusi penuh ke jendela dengan resolusi yang sama?


8

Gambar saya 1280x800, dan ukuran layar saya 1280x800. Itu harus menggambar dengan sempurna. Saya membuat quad ukuran layar, dan mengatur tekstur agar sesuai dengan quad. Tapi sekarang ini menggambar tekstur persegi di sudut kiri atas layar saya yang keluar dari skala dan tidak cukup besar.

Saya tidak tahu mengapa itu tidak berhasil, saya sudah mencoba menulis ukuran tekstur yang lebih besar ketika menggambar dan sepertinya berhasil, tetapi saya tidak tahu mengapa itu tidak berhasil ketika menggambar pada sebuah 1280x800 quad.

Bagaimana cara membuat quad layar penuh?

Begini cara saya saat ini melakukannya:

Ini adalah OPENGL saya dan kode pengaturan tampilan:

    DisplayMode displayMode = null;
    DisplayMode[] modes = Display.getAvailableDisplayModes();

    for (int i = 0; i < modes.length; i++) {
        if (modes[i].getWidth() == World.SCREEN_WIDTH && modes[i].getHeight() == World.SCREEN_HEIGHT && modes[i].isFullscreenCapable()) {
            displayMode = modes[i];
        }
    }

    Display.setDisplayMode(displayMode);
    Display.setFullscreen(false);
    Display.create();

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, World.SCREEN_WIDTH, World.SCREEN_HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

Ini adalah kode saya untuk menggambar quad bertekstur:

    background = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/menu/background.png")));

    glBindTexture(GL_TEXTURE_2D, background.getTextureID());
    glPushMatrix();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0); // Upper left

    glTexCoord2f(1, 0);
    glVertex2f(World.SCREEN_WIDTH, 0); // Upper right

    glTexCoord2f(1, 1);
    glVertex2f(World.SCREEN_WIDTH, World.SCREEN_HEIGHT); // Lower right

    glTexCoord2f(0, 1);
    glVertex2f(0, World.SCREEN_HEIGHT); // Lower left
    glEnd();
    glPopMatrix();

Kedengarannya seperti Slick2D menciptakan tekstur yang kekuatan dua ukuran. Lihat slick.ninjacave.com/forum/viewtopic.php?p=26076
msell

@ msell Lalu bagaimana cara menutupi layar 1280x800 saya?
Louis Hong

2
Meskipun ini mungkin masalah yang sebenarnya bagi Anda, ini sepertinya lebih seperti jenis "debug kode saya", yang tidak cocok untuk menumpuk gaya pertukaran Q / A.
Katu

Sebenarnya bukan, ini masalah LWJGL yang sebenarnya. Saya punya jawaban untuk pertanyaan itu. Tapi saya tidak suka bagaimana orang-orang berpangkat tinggi berkeliling memberikan suara tanpa benar-benar melihat konten @Katu
Louis Hong

1
Ukuran power-of-two tidak menjadi masalah karena texcoords yang digunakan akan meregangkan atau menekan tekstur untuk mengisi layar. Lebih mungkin adalah bahwa matriks modelview bukan identitas - lihat jawaban saya di bawah ini.
Maximus Minimus

Jawaban:


5

Kemungkinan penyebabnya adalah bahwa Anda mungkin tidak memiliki identitas dalam matriks modelview Anda ketika Anda datang untuk menggambar quad layar penuh. Ini bisa terjadi jika Anda menggambar hal lain sebelum quad.

Saya perhatikan dari kode pengaturan Anda bahwa Anda benar beralih ke mode matriks ke GL_MODELVIEW, tetapi kemudian Anda tidak membuat panggilan glLoadIdentity setelah melakukannya (ini OK karena seharusnya identitas awalnya, tapi itu kebiasaan yang baik untuk masuk).

Saat menggambar quad Anda, Anda memilikinya dikelilingi oleh panggilan glPushMatrix / glPopMatrix. Ini sendiri tidak cukup untuk membuat identitas matriks; dari spesifikasi :

glPushMatrix mendorong tumpukan matriks saat ini satu per satu, menduplikasi matriks saat ini . Artinya, setelah panggilan glPushMatrix, matriks di atas tumpukan identik dengan yang di bawahnya .

(Penekanan saya.)

Dengan kata lain, jika matriks modelview sebelumnya bukan identitas, maka mengikuti panggilan glPushMatrix, matriks modelview baru juga tidak akan menjadi identitas.

Perbaikan paling sederhana adalah menambahkan glLoadIdentity setelah panggilan glPushMatrix Anda.


Wow, ini sangat rumit. Bagaimana cara kerja matriks?
Louis Hong

1
Anda harus mencari beberapa materi tutorial untuk itu - ini sangat di luar topik untuk situs ini.
Maximus Minimus
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.