Как сделать так, чтобы текстуры OpenGL масштабировались, не становясь размытыми?

15

Я использую OpenGL через LWJGL.

У меня 16x16 текстурированный квадрант рендеринга в 16x16. Когда я изменяю величину шкалы, квадратор растет, а затем становится более размытым.

Как я могу сделать его масштабируемым, не становясь размытым, как в Minecraft.

Вот код внутри моего объекта 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();

}

А вот код из моего метода initGL в моем классе игры

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

А вот код, который делает фактический рисунок

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
источник

Ответы:

17

Вам нужно изменить тип увеличения текстуры, например:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Читайте о glTexParameter .

Ricket
источник
Не будет ли это увеличение, которое он хочет изменить, так как текстура отображается в увеличенном масштабе?
Neverender
Спасибо за ваш ответ Рикет. Я сейчас прочитал документацию по glTexParameter и увидел, что здесь есть много полезных вещей для работы. Кроме того, я добавил GL_TEXTURE_MINи GL_TEXTURE_MAGдля визуализации кода. Работает как я ожидал. Теперь я ухожу, чтобы узнать больше.
восхитительный
@ZachB, я думаю, что вы правы и соответственно отредактированы. При подготовке этого ответа я очень внимательно прочитал документацию , но, вероятно, просто запутался в этом. Я бы просто протестировал один способ, а затем другой, но сейчас у меня нет ничего удобного для тестирования.
Рикет
7

Ты не можешь Природа любого вида цифровых данных заключается в том, что после удаления информации ее уже нельзя вернуть, и аналогичным образом вы не можете заполнить информацию, которой вообще никогда не было - лучшее, что вы можете сделать, это приблизительное приближение, что дает вам размытость.

Использование GL_NEAREST не будет размытым, но вместо этого оно станет пиксельным.

Решение состоит в том, чтобы использовать большую текстуру с мипмапами. Таким образом, вы получите хорошее качество независимо от размера текстурированной геометрии.

Максимус Минимус
источник
2
adorablepuppy искал пиксельный эффект, как я получил от него, сказав «как в Minecraft » - но хороший улов. Я даже не думал об этом, когда меня об этом спрашивали.
Рикет
Спасибо за ваш вклад, а также. Мне это нужно, так как я собираюсь смешать несколько разных стилей рендеринга.
восхитительный
Вопрос в том, почему вы не можете перекрывать текстуру несколько раз?
joehot200
2

Я столкнулся с этой проблемой на собственном опыте - создание блочной игры с текстурами низкого разрешения (8px * 8px). Независимо от того, насколько близко или как далеко была камера, текстуры по умолчанию смешивались с помощью настроек OpenGL - они выглядели размытыми.

Вам нужно включить «ближайшее» увеличение, чтобы отключить билинейную фильтрацию. То есть, когда камера приближается к текстуре; каждый пиксель определяется как цвет ближайшего текселя - без наложения.

Вы делаете это с этими двумя строками:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
мыльная пена
источник