#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.