Come posso ridimensionare le trame OpenGL senza diventare sfocate?


15

Sto usando OpenGL tramite LWJGL.

Ho un rendering quadruplo con texture 16x16 a 16x16. Quando cambio la sua quantità di scala, il quad cresce, quindi diventa più sfocato man mano che aumenta.

Come posso ridimensionarlo senza diventare sfocato, come in Minecraft.

Ecco il codice all'interno del mio oggetto RenderableEntity:

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();

}

Ed ecco il codice del mio metodo initGL nella mia classe di gioco

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);

Ed ecco il codice che esegue il disegno reale

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);
        }
    }
}

Risposte:


17

È necessario modificare il tipo di ingrandimento della trama, in questo modo:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Leggi glTexParameter .


Non sarebbe l'ingrandimento che vuole cambiare, poiché la trama viene visualizzata su una scala ingrandita?
Neverender,

Grazie per la tua risposta Ricket. Ora ho letto la documentazione su glTexParameter e vedo che ci sono molte chicche qui con cui lavorare. Inoltre, ho aggiunto il codice GL_TEXTURE_MINe GL_TEXTURE_MAGper il rendering. Funziona come mi aspettavo. Ora vado fuori per saperne di più.
adorablepuppy,

@ZachB, penso che tu abbia ragione e modificato di conseguenza. Ho letto molto attentamente la documentazione durante la preparazione di questa risposta, ma probabilmente mi sono semplicemente confuso nel farlo. Vorrei solo testare in un modo e poi nell'altro, ma al momento non ho qualcosa di conveniente con cui provare.
Ricket,

7

Non puoi. La natura di qualsiasi tipo di dato digitale è che una volta che le informazioni sono state rimosse non possono più essere rimesse a disposizione e allo stesso modo non è possibile inserire informazioni che non sono mai state lì in primo luogo: il meglio che puoi fare è un'approssimazione approssimativa, che ti dà sfocatura.

L'uso di GL_NEAREST non si sbiadirà ma diventerà invece pixelato.

La soluzione è utilizzare una trama più grande con le mipmap. In questo modo ottieni una buona qualità, indipendentemente dalle dimensioni della geometria da strutturare.


2
adorablepuppy stava cercando l'effetto pixelato, come ho ottenuto da lui dicendo "come in Minecraft " - ma bella cattura. Non pensavo nemmeno che fosse stato chiesto in quel modo.
Ricket,

Grazie anche per il tuo contributo. Ne avrò bisogno, dato che mescolerò insieme alcuni stili di rendering diversi.
adorablepuppy,

La domanda è: perché non puoi sovrapporre più volte la trama?
joehot200,

2

Ho riscontrato questo problema in prima persona: creare un gioco basato su blocchi con trame a bassa risoluzione (8px * 8px). Indipendentemente dalla distanza o dalla distanza della videocamera, le trame venivano incrociate "miscelate" dalle impostazioni predefinite di OpenGL: apparivano sfocate.

È necessario abilitare l'ingrandimento "più vicino" per disabilitare il filtro bilineare. Cioè, quando la fotocamera viene ingrandita vicino alla trama; ogni pixel è definito come il colore del texel più vicino - nessuna fusione.

Lo fai con queste due righe:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.