Игра на основе 2D-плиток, показывает промежутки между спрайтами плитки, когда я увеличиваю масштаб с помощью камеры?

#c #direct3d #direct3d9

#c #direct3d #direct3d9

Вопрос:

Я использую метод D3DXSPRITE для отображения моих плиток карты на экране, я только что добавил функцию масштабирования, которая увеличивает масштаб, когда вы удерживаете стрелку вверх, но заметил, что теперь вы можете видеть промежутки между плитками, вот несколько снимков экрана

обычный размер (32×32) для плитки

введите описание изображения здесь

увеличено (вы можете видеть белые промежутки между плитками)

введите описание изображения здесь

уменьшено (даже хуже!)

введите описание изображения здесь

Вот фрагмент кода, с помощью которого я перевожу и масштабирую мир.

 D3DXMATRIX matScale, matPos;

D3DXMatrixScaling(amp;matScale, zoom_, zoom_, 0.0f);
D3DXMatrixTranslation(amp;matPos, xpos_, ypos_, 0.0f);

device_->SetTransform(D3DTS_WORLD, amp;(matPos * matScale));
  

И это мой рисунок карты (плитки находятся в векторе вектора плиток.. и я еще не закончил отбраковку)

 LayerInfo *p_linfo = NULL;
  RECT rect = {0};
  D3DXVECTOR3 pos;
  pos.x = 0.0f;
  pos.y = 0.0f;
  pos.z = 0.0f;

  for (short y = 0; 
    y < BottomTile();   y)
  {
    for (short x = 0; 
          x < RightTile();   x)
    {
      for (int i = 0; i < TILE_LAYER_COUNT;   i)
      {
        p_linfo = tile_grid_[y][x].Layer(i);

        if (p_linfo->Visible())
        {
          p_linfo->GetTextureRect(amp;rect);

          sprite_batch->Draw(
            p_engine_->GetTexture(p_linfo->texture_id), 
            amp;rect, NULL, amp;pos, 0xFFFFFFFF);
        }
      }
      pos.x  = p_engine_->TileWidth();
    }
    pos.x = 0;
    pos.y  = p_engine_->TileHeight();
  }
  

Комментарии:

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

2. Вам действительно нужно использовать шейдеры и ID3DXEffect, а не фиксированную функцию.

3. линии не меняют цвет, просто выглядят белыми, я пробовал четкие как красные, синие, черные, все выглядят одинаково.

4. я посмотрю на d3dxeffect

Ответ №1:

Ваши индексы текстуры неверны. 0,0,32,32 — неправильное значение — оно должно быть 0,0,31,31. Индекс на основе нуля в вашем текстурном атласе в 256 пикселей даст значения от 0 до 255, а не от 0 до 256, а текстура 32×32 должна давать 0,0,31,31. В этом случае цвет неправильных пикселей зависит от цвета следующей текстуры справа и снизу.

Комментарии:

1. Швы — это цвета текстуры справа и снизу! но я попытался вернуть прямоугольник 0,0,31,31, и теперь у меня разрыв в 1 пиксель. Почему я могу видеть швы только при увеличении или уменьшении масштаба? и если я сделаю скриншот и проверю в paint, каждая плитка теперь имеет ширину 31 пиксель и не хватает столбца пикселей

2. @Kaije: Вполне может быть, что ваш код макета отключен для их размещения на экране.

3. Каждая плитка расположена на расстоянии 32 пикселей друг от друга в цикле, и при 0,0,31,31 каждая плитка имеет разрыв в 1 пиксель с каждой стороны, когда я делаю снимок экрана и увеличиваю масштаб, я подсчитываю пиксели 1 плитки и ее 31×31 пикселей, при этом часть текстуры отсутствует

4. Я думаю, что для этого нужно 0-32, потому что обычно, когда вы перебираете что-то, что вам нравится (i = 0; i < 32; i ), оно проходит через 0-31

5. @Kaije: Вам следует попробовать загружать текстуру по отдельности и передавать NULL для прямоугольника, и посмотреть, решит ли это проблему на ahnd

Ответ №2:

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

Я так думаю.

Комментарии:

1. Я думаю, что это реальный ответ. Интерполяция текстуры позволяет получить доступ к нескольким текселям. На границе некоторые текселы не имеют значений, что приводит к этим артефактам. Mipmapping усугубляет эти проблемы. Однако ваша текстура выглядит такой простой, может быть, вы можете установить режим повтора.

Ответ №3:

У меня также была похожая проблема с отображением текстур. Что сработало для меня, так это изменение режима адреса текстуры в описании состояния сэмплера; режим адреса текстуры используется для управления тем, что direct3d делает с координатами текстуры за пределами диапазона ([0.0f, 1.0f]): я изменил элементы ADDRESS_U, ADDRESS_V, ADDRESS_W на D3D11_TEXTURE_ADDRESS_CLAMP, который в основном преобразует все значения вне диапазона для координат текстуры в [0.0f , 1.0f] диапазон.

Ответ №4:

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

идеальный пиксель-2d с официального сайта Unity

на собственном опыте плюс я выяснил, что если PPI спрайта равен 72 (например), вы должны попытаться использовать больше PPI для этого изображения (возможно, 96 или больше).).На самом деле это делает спрайт более плотным и не оставляет места для появления белых пробелов.

Комментарии:

1. Смотри также forum.unity3d.com/threads/tile-map-tearing-problems.225777 / …

Ответ №5:

Добро пожаловать в мир чисел с плавающей запятой. Эти промежутки существуют из-за несовершенства использования чисел с плавающей запятой.

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

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

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

Комментарии:

1. Это не FP-несовершенство, это слишком регулярно.

2. @DeadMG Хм, нет. Держу пари, что это проблема с округлением, возникающая в растеризаторе. Учитывая, как все настроено. Вы можете свести к минимуму видимость таких проблем, но они всегда будут там.

3. Проблемы с округлением не будут регулярно давать эффект, поскольку представление с плавающей запятой распределено неравномерно. Артефакты будут либо более, либо менее присутствовать в нижнем диапазоне.

4. Хорошо, но что, если матрицы просмотра и / или проекции были настроены неблагоприятно?

5. У меня точно такая же проблема в Unity. Я почти уверен, что это несовершенство fp.