Java libgdx 1.20版本纹理错误

Java libgdx 1.20版本纹理错误,libgdx,textures,Libgdx,Textures,两天来,我一直在试图修复我的游戏中浮雕和失真纹理的错误。我在互联网上搜索,我尝试了一些解决方案,比如使用scene2d,但没有成功。我该怎么办 此屏幕截图显示了问题:角色移动时,一只眼睛有时比另一只眼睛大: 编辑: 当我使用sprite.setPosition((int)sprite.getX(),(int)sprite.getY())时,我仍然遇到了眼睛宽度差的问题;每次在我渲染我的角色之前 当我从答案中使用自定义视口时,我在游戏窗口上看不到任何东西我做错了什么 package com.my

两天来,我一直在试图修复我的游戏中浮雕和失真纹理的错误。我在互联网上搜索,我尝试了一些解决方案,比如使用scene2d,但没有成功。我该怎么办

此屏幕截图显示了问题:角色移动时,一只眼睛有时比另一只眼睛大:

编辑:

当我使用sprite.setPosition((int)sprite.getX(),(int)sprite.getY())时,我仍然遇到了眼睛宽度差的问题;每次在我渲染我的角色之前

当我从答案中使用自定义视口时,我在游戏窗口上看不到任何东西我做错了什么

package com.mygdx.redHoodie;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.viewport.StretchViewport;

public class GameScreen implements Screen {
    public static final int GAME_WIDTH = 800;
    public static final int GAME_HEIGHT= 480 ;

    SpriteBatch batch;
    Background background;
    public Hoodie hoodie;

    public PixelMultipleViewport viewport;
       OrthographicCamera camera;
    public int gameMode; // 0 normalna gra, 1 level up, 2 end game

    public GameScreen(){
         camera= new OrthographicCamera(GAME_WIDTH,GAME_HEIGHT);


         viewport = new PixelMultipleViewport(GAME_WIDTH, GAME_HEIGHT, camera);
         viewport.update();
         camera.setToOrtho(false, GAME_WIDTH, GAME_HEIGHT);
        batch = new SpriteBatch();

        //klasy wyswietlane
        background= new Background(this);
        hoodie = new Hoodie(this);

        startNewGame();
    }

    @Override
    public void render(float delta) {
        // TODO Auto-generated method stu

         Gdx.gl.glClearColor(1, 1, 0, 1);

         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
         batch.setProjectionMatrix(camera.projection);
            batch.setTransformMatrix(camera.view);

         camera.update();
         //batch.setProjectionMatrix(camera.combined);
         this.update(delta);
         this.batch.begin();
            toRender(delta);
         this.batch.end();



    }

    public void update(float delta){
        hoodie.update(delta);
    }

    public void toRender(float delta){
        background.render();
        hoodie.render();

    }

    public void startNewGame(){

    }
    public void startNevLevel(){

    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub
        viewport.update(width, height,false);
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub

    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub

    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

}

加载纹理时,请使用线性过滤和mip贴图。默认过滤器为“最近/最近”,这将导致您看到的问题

Texture myTexture = new Texture("textureFilename", true); //must enable mip-mapping in constructor
myTexture.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear);
编辑:

我现在意识到,看着你的截图,你正在一个更大的窗口中绘制像素图形。为了做到这一点,是的,您需要保留最近/最近的筛选,而不是我建议的

若要避免某些像素的大小发生变化,必须将角色移动和摄影机移动取整到最近的世界单位。当角色位于像素之间时,精灵像素的大小会发生变化,因为它们与屏幕像素不对齐

您已缩放世界,因此一个单位等于一个大像素。因此,无论何时绘制任何东西,都需要首先将其位置四舍五入到x和y中最接近的整数,以及相机位置。因此,移动相机或精灵后,必须执行以下操作:

sprite.position.set((int)sprite.position.x,(int)sprite.position.y,sprite.position.z);
就您的视口而言,如果您不想要任何黑条,您可能需要一个自定义视口类,该类尝试尽可能接近您所需的分辨率,然后将其向外扩展以避免失真。ExtendViewport做了类似的事情,但与像素化图形的区别在于,您需要世界分辨率是屏幕分辨率的整数倍,这样像素的边缘看起来清晰而不是模糊

我想这会满足你的要求。它将获取所需的屏幕分辨率并将其缩小,以适合屏幕像素中每个像素的大小为整数的情况。然后,它将视图扩展到所需的分辨率之外,以避免失真和黑条。此类假设所有屏幕尺寸始终是4的倍数。我想那是真的。如果你想变得更有趣,为了安全起见,你可以使用OpenGL剪刀将视口大小四舍五入到最接近的4倍。最多你会有2个像素的黑条,我认为这是不明显的

public class PixelMultipleViewport extends Viewport {

    private int minWorldWidth, minWorldHeight;

    public PixelMultipleViewport (int minWorldWidth, int minWorldHeight, Camera camera) {
        this.minWorldHeight = minWorldHeight;
        this.minWorldWidth = minWorldWidth;
        this.camera = camera;
    }

    @Override
    public void update (int screenWidth, int screenHeight, boolean centerCamera) {

        viewportWidth = screenWidth;
        viewportHeight = screenHeight;

        int maxHorizontalMultiple = screenWidth / minWorldWidth;
        int maxVerticalMultiple = screenHeight / minWorldHeight;

        int pixelSize = Math.min(maxHorizontalMultiple, maxVerticalMultiple);

        worldWidth = (float)screenWidth/(float)pixelSize;
        worldHeight = (float)screenHeight/(float)pixelSize;

        super.update(screenWidth, screenHeight, centerCamera);
    }
}

我刚刚遇到了一个不同的选择。这是一种以任意分辨率以您喜欢的比例绘制场景的方法,无需黑条

视觉质量将比我的另一个答案稍差(在我的另一个答案中,您以所需场景比例的整数倍绘制),但比使用屏幕截图中的直接最近过滤效果要好得多

基本思想是以所需的比例将所有内容绘制到一个小帧缓冲区,然后使用放大着色器(与线性过滤不同)将帧缓冲区的颜色纹理绘制到屏幕上,该着色器仅沿精灵像素的边缘插值像素颜色


解释。我没有将它移植到Libgdx或测试它。我不确定这个着色器在移动设备上运行得如何。它包括对每个屏幕片段运行四个相关的纹理查找

我知道这个话题很老了,但随着我的搜索,可能会有更多的人关注。我也有同样的像素撕裂问题,但只是在我的iOS 9 iPhone4S上。它在我的Android 9像素2上渲染得很好。尝试了很多东西(特别是圆整到全像素),但即使使用未缩放的全屏正交相机,它也会受到伪影的影响


强迫我的纹理为POT(二的力量)修复了这个问题

在不知道如何加载纹理的情况下很难计算。你能提供代码吗?可能是引入了错误,或者您正在以意外的方式使用纹理。从libgdx社区论坛来看,这似乎不是一个常见的问题,因为那里没有人抱怨过。我在做与本教程相同的项目时,也在复制stackoverflow问题中的粘贴解决方案时发现了这个错误:也许你可以更详细地描述一下闪烁和扭曲的含义,因为这些术语对不同的人意味着不同的东西。例如,你刚才链接的另一个问题似乎与精灵从一个位置跳到另一个位置有关,这不是我所说的闪烁。我的角色有一双黑色矩形的小眼睛,在视口的某些连线中,一只眼睛比另一只眼睛大。在1.0中,我没有这个问题。这可能与相机设置和纹理过滤模式的组合有关。如果你展示你的代码,也许我们能找到答案。使用这个纹理过滤器更好,但现在眼睛看起来像是在雾中。我刚刚检查过,在stretchet视口中仍然存在相同的问题。使用FitViewport时效果更好。有没有什么方法可以不带黑条,也没有失真的纹理?好吧,我看看如何修复它。。。我会改变这个答案。我仍然有问题与失真的像素,当我使用这个wiev端口,我看不到只有黑屏上的游戏窗口。请看我的问题。