如何使OpenGL纹理缩放而不会变得模糊?


15

我正在通过LWJGL使用OpenGL。

我有16x16的16x16纹理四边形渲染。当我更改其比例大小时,四边形会变大,然后随着变大而变得模糊。

像在《我的世界》中一样,如何使它缩放而不变得模糊。

这是我的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);
        }
    }
}

Answers:


17

您需要更改纹理放大类型,如下所示:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

了解有关glTexParameter的信息


因为要以放大的比例显示纹理,所以他要更改不是放大吗?
Neverender

感谢您的回复Ricket。我现在已经阅读了glTexParameter上的文档,并发现这里有很多好东西可以使用。此外,我添加了GL_TEXTURE_MINGL_TEXTURE_MAG渲染代码。符合我的预期。现在我要学习更多。
adorablepuppy

@ZachB,我认为您是正确的并进行了相应的编辑。在准备此答案时,我非常仔细地阅读了文档,但这样做可能会使我感到困惑。我只会先测试一种方法,然后再测试另一种方法,但是目前我没有方便的测试方法。
Ricket

7

你不能 任何类型的数字数据的本质是,信息一旦被删除就永远不会被放回去,同样,您也无法填充一开始就从未存在过的信息-您能做的最好的就是粗略的近似,这会使您模糊不清。

使用GL_NEAREST不会模糊,但会变成像素化。

解决方案是对mipmap使用更大的纹理。这样,无论要纹理化的几何体大小如何,您都可以获得高质量。


2
我从他那里说“像在《我的世界》中一样”时,lovelypuppy一直在寻找像素化的效果-但是很好。我什至都没有想过要这样问。
莉吉特

也感谢您的输入。我将需要它,因为我将把几种不同的渲染样式混合在一起。
adorablepuppy

问题是,为什么不能多次重叠纹理?
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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.