Comment faire évoluer les textures OpenGL sans devenir floue?

15

J'utilise OpenGL via LWJGL.

J'ai un rendu quad texturé 16x16 à 16x16. Lorsque je modifie sa valeur d'échelle, le quad se développe, puis devient plus flou à mesure qu'il grandit.

Comment puis-je le faire évoluer sans devenir flou, comme dans Minecraft.

Voici le code à l'intérieur de mon objet 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();

}

Et voici le code de ma méthode initGL dans ma classe de jeu

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

Et voici le code qui fait le dessin réel

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);
        }
    }
}
adorable chiot
la source

Réponses:

17

Vous devez changer le type d'agrandissement de la texture, comme ceci:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Lisez à propos de glTexParameter .

Ricket
la source
Ne serait-ce pas le grossissement qu'il voudrait changer, puisque la texture est affichée à l'échelle agrandie?
Neverender
Merci pour votre réponse Ricket. J'ai maintenant lu la documentation sur glTexParameter et je vois qu'il y a de nombreux atouts ici pour travailler. De plus, j'ai ajouté le GL_TEXTURE_MINet GL_TEXTURE_MAGpour rendre le code. Fonctionne comme je m'y attendais. Maintenant je pars pour en savoir plus.
adorablepuppy
@ZachB, je pense que vous avez raison et modifié en conséquence. J'ai lu la documentation très attentivement lors de la préparation de cette réponse, mais je me suis probablement trompé en le faisant. Je voudrais simplement tester dans un sens puis dans l'autre, mais je n'ai pas quelque chose de pratique à tester pour le moment.
Ricket
7

Tu ne peux pas. La nature de tout type de données numériques est qu'une fois que les informations ont été supprimées, elles ne peuvent jamais être réintégrées, et de même, vous ne pouvez pas remplir des informations qui n'ont jamais été là en premier lieu - le mieux que vous puissiez faire est une approximation approximative, ce qui vous donne un flou.

L'utilisation de GL_NEAREST ne sera pas floue, mais elle deviendra pixellisée à la place.

La solution consiste à utiliser une texture plus grande avec des mipmaps. De cette façon, vous obtenez une bonne qualité quelle que soit la taille de la géométrie texturée.

Maximus Minimus
la source
2
adorablepuppy cherchait l'effet pixélisé, comme je l'ai appris de lui en disant "comme dans Minecraft " - mais belle prise. Je ne pensais même pas qu'on le demandait de cette façon.
Ricket
Merci également pour votre contribution. J'en aurai besoin, car je vais mélanger plusieurs styles de rendu différents.
adorablepuppy
La question est, pourquoi ne pouvez-vous pas chevaucher la texture plusieurs fois?
joehot200
2

J'ai rencontré ce problème de première main - créer un jeu basé sur des blocs avec des textures basse résolution (8px * 8px). Peu importe la distance ou la distance de la caméra, les textures étaient «mélangées» croisées par les paramètres par défaut d'OpenGL - elles semblaient floues.

Vous devez activer le grossissement "le plus proche" pour désactiver le filtrage bilinéaire. Autrement dit, lorsque la caméra est zoomée près de la texture; chaque pixel est défini comme la couleur du texel la plus proche - pas de mélange.

Vous faites cela avec ces deux lignes:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Suds
la source