2015-09-17 3 views
0

Я новичок в LibGDX и пытался реализовать фон параллакса. Все шло хорошо, пока я не столкнулся с такой проблемой: при прокрутке фона я получаю полосы. Вы можете увидеть его в прилагаемом изображении:Проблема с выпуском текстуры LibGDX

Texture Bleeding

Так что я смотрел глубже в проблему и выяснил, что это какое-то текстура кровотечения. Но дело в том, что у моих текстур уже установлен фильтр [Linear, Nearest], а TexturePacker использует duplicatePadding. На самом деле, я не знаю других методов решения этой проблемы. Пожалуйста помоги!

Вот некоторые из моего кода:

TexturePacker

TexturePacker.Settings settings = new TexturePacker.Settings(); 
settings.minWidth = 256; 
settings.minHeight = 256; 
settings.duplicatePadding = true; 
TexturePacker.process(settings, "../../design", "./", "textures"); 

AssetLoader

textureAtlas = new TextureAtlas(Gdx.files.internal("textures.atlas")); 

for (int i = 0; i < 2; i++) { 
    Background.skies.add(textureAtlas.findRegion("background/sky", i)); 
    Background.skies.get(i).getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest); 
} 

for (int i = 0; i < 2; i++) { 
    Background.clouds.add(textureAtlas.findRegion("background/cloud", i)); 
    Background.clouds.get(i).getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest); 
} 

for (int i = 0; i < 8; i++) { 
    Background.cities.add(textureAtlas.findRegion("background/city", i)); 
    Background.cities.get(i).getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest); 
} 

Background.moon = textureAtlas.findRegion("background/moon"); 
Background.forest = textureAtlas.findRegion("background/forest"); 
Background.road = textureAtlas.findRegion("background/road"); 

Background.moon.getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest); 
Background.forest.getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest); 
Background.road.getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Nearest); 

BackgroundDrawer

private void drawParallaxTextureList(Batch batch, List<TextureAtlas.AtlasRegion> list, 
            float moveX, float posY) { 
    for (int i = 0; i < list.size(); i++) { 
     boolean needDraw = false; 

     float shift = GameScreen.VIEWPORT_WIDTH * i; 
     float drawX = 0.0f; 

     if (shift - moveX <= -(GameScreen.VIEWPORT_WIDTH)) { // If it's behind the screen 
      if (i == 0) { // If it's first element 
       if (moveX >= GameScreen.VIEWPORT_WIDTH * (list.size() - 1)) { // We need to show first after last 
        needDraw = true; 
        drawX = (GameScreen.VIEWPORT_WIDTH) - (moveX - ((GameScreen 
          .VIEWPORT_WIDTH) * (list.size() - 1))); 
       } 
      } 
     } else if (shift - moveX < (GameScreen.VIEWPORT_WIDTH - 1)) { 
      needDraw = true; 
      drawX = shift - moveX; 
     } 

     if (needDraw) { 
      batch.draw(list.get(i), (int) drawX, (int) posY); 
     } 
    } 
} 

ПРИМЕЧАНИЕ: Я не использую камеру для рисования прямо сейчас. Я использую только FitViewport с размером 1920x1280. Кроме того, кровотечение иногда появляется даже при разрешении FullHD.

UPDATE: Установка обоих Nearest фильтров для минификация и magification с увеличением paddingX и отключение сглаживания решить проблему, но окончательное изображение становится слишком некрасиво! Есть ли способ избежать отключения сглаживания? Потому что без него, скудные выглядят ужасно.

+0

Помогает ли отключить сглаживание, если вы оставите фильтр линейным? Почему вы все равно используете сглаживание в 2D-игре? – Tenfour04

ответ

0

Попробуйте установить как мин и Mag фильтры, как Ближайшие

.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest); 

В GUI TexturePacker есть возможность выдавливать графику - это значит повторять каждый пограничного пикселя текстуры. После этого вы можете установить оба фильтра Линейный

.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); 

, но, к сожалению, я не могу увидеть эту опцию в TexturePacker.Settings объект, который вы используете. Вы можете попробовать установить Linear для обоих, но я уверен, что он не будет работать (линейный фильтр принимает ближайшие 4 текселя, чтобы сгенерировать его, чтобы он, вероятно, все еще вызывал проблемы).

Попробуйте использовать GUI Texturepacker затем с опцией выдавливания возможно

+1

Смотрите, пожалуйста, обновление в сообщении. Установка «Nearest» вызывает ужасное качество рендеринга в нисходящем масштабе. – Alviere

+0

yup Я ожидал этого :(- проверить мое обновление –

+0

Я не могу запустить эту банку, которую я нашел в коде google на моем mac. Он говорит 'Не удалось найти или загрузить основной класс texturepacker-gui.jar' – Alviere

0

Несколько возможных причин этого артефакта:

  1. Возможно заполнение не является достаточно большим, когда разрешение спрайт съежился. Попробуйте изменить файл filterMin текстурного упаковщика на MipMapLinearNearest. А также попробуйте увеличить размер paddingX и paddingY.

  2. Возможно, вы видите тусклые или яркие пиксели на краю вашего спрайта, потому что вы не используете предварительно умноженный альфа, а цвет фона вашей текстуры (где его альфа-ноль) белый. Попробуйте установить premultiplyAlpha: true. Если вы это сделаете, вам нужно также изменить функцию смешивания SpriteBatch на (GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA) для правильной рендеринга.

  3. Вы, кажется, округлите свои позиции и размеры спрайтов до целых чисел, когда рисуете их. Это будет работать в идеальной игре с пикселями, где вы уверены, что спрайты отображаются точно с разрешением 1: 1 на экране. Но как только размер экрана не соответствует точно, ваше округление может вызвать пробелы шириной менее 1 пикселя, которые будут выглядеть полупрозрачными пикселями.

+0

1: не помогает. Помогает только с фильтром 'Nearest'. но ОК в нисходящем масштабе. 2: не помогает. 3: не влияет ни на собственное разрешение, ни на понижение. – Alviere

Смежные вопросы