Bagaimana saya bisa membuat skala tekstur OpenGL tanpa menjadi buram?

15

Saya menggunakan OpenGL melalui LWJGL.

Saya memiliki rendering quad 16x16 bertekstur pada 16x16. Ketika saya mengubah jumlah skalanya, quad tumbuh, lalu menjadi lebih blur karena semakin besar.

Bagaimana saya bisa membuatnya skala tanpa menjadi buram, seperti di Minecraft.

Berikut adalah kode di dalam objek RenderableEntity saya:

public void render(){       
    Color.white.bind();
    this.spriteSheet.bind();        
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0,0);
        GL11.glVertex2f(this.x, this.y);
        GL11.glTexCoord2f(1,0);
        GL11.glVertex2f(getDrawingWidth(), this.y);
        GL11.glTexCoord2f(1,1);
        GL11.glVertex2f(getDrawingWidth(), getDrawingHeight());
        GL11.glTexCoord2f(0,1);
        GL11.glVertex2f(this.x, getDrawingHeight());
     GL11.glEnd();

}

Dan ini kode dari metode initGL saya di kelas game saya

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glClearColor(0.46f,0.46f,0.90f,1.0f);
GL11.glViewport(0,0,width,height);
GL11.glOrtho(0,width,height,0,1,-1);

Dan di sini adalah kode yang melakukan gambar yang sebenarnya

public void start(){
    initGL(800,600);
    init();

    while(true){
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        for(int i=0;i<entities.size();i++){
            ((RenderableEntity)entities.get(i)).render();
        }

        Display.update();
        Display.sync(100);

        if(Display.isCloseRequested()){
            Display.destroy();
            System.exit(0);
        }
    }
}
adorablepuppy
sumber

Jawaban:

17

Anda perlu mengubah jenis pembesaran tekstur, seperti:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Baca tentang glTexParameter .

Ricket
sumber
Bukankah itu pembesaran yang ingin dia ubah, karena teksturnya ditampilkan pada skala yang diperbesar?
Neverender
Terima kasih atas tanggapan Anda, Ricket. Saya sekarang telah membaca dokumentasi di glTexParameter dan melihat ada banyak barang untuk dikerjakan. Selain itu, saya menambahkan GL_TEXTURE_MINdan GL_TEXTURE_MAGuntuk membuat kode. Bekerja seperti yang saya harapkan. Sekarang saya akan belajar lebih banyak.
adorablepuppy
@ ZachB, saya pikir Anda benar dan diedit sesuai. Saya membaca dokumentasi dengan sangat hati-hati ketika menyiapkan jawaban ini, tetapi mungkin hanya bingung sendiri melakukannya. Saya hanya akan menguji satu cara dan kemudian yang lain, tetapi saya tidak memiliki sesuatu yang nyaman untuk diuji saat ini.
Ricket
7

Kamu tidak bisa Sifat segala jenis data digital adalah bahwa begitu informasi telah dihapus, maka tidak akan pernah dapat dikembalikan, dan Anda juga tidak dapat mengisi informasi yang tidak pernah ada di tempat pertama - yang terbaik yang dapat Anda lakukan adalah perkiraan kasar, yang memberi Anda kabur.

Menggunakan GL_NEAREST tidak akan buram tetapi itu akan menjadi pixeled sebagai gantinya.

Solusinya adalah menggunakan tekstur yang lebih besar dengan mipmaps. Dengan begitu Anda mendapatkan kualitas yang baik tidak peduli berapa ukuran geometri yang ditekstur.

Maximus Minimus
sumber
2
adorablepuppy sedang mencari efek pixelated, seperti yang saya dapat dari dia mengatakan "suka di Minecraft " - tapi bagus menangkap. Aku bahkan tidak memikirkannya seperti itu.
Ricket
Terima kasih atas masukan Anda juga. Saya akan membutuhkannya, karena saya akan mencampur beberapa gaya render yang berbeda menjadi satu.
adorablepuppy
Pertanyaannya adalah, mengapa Anda tidak bisa tumpang tindih tekstur beberapa kali?
joehot200
2

Saya telah mengalami masalah ini secara langsung - membuat game berbasis blok dengan tekstur beresolusi rendah (8px * 8px). Tidak peduli seberapa dekat atau seberapa jauh kamera itu, teksturnya sedang "dicampur" oleh pengaturan default OpenGL - mereka tampak buram.

Anda harus mengaktifkan pembesaran "terdekat" untuk menonaktifkan pemfilteran bilinear. Yaitu, saat kamera diperbesar mendekati tekstur; setiap piksel didefinisikan sebagai warna texel yang terdekat - tidak ada campuran.

Anda melakukan ini dengan dua baris ini:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Busa
sumber