Избавление от кровотечения из текстуры

Изменить: Я выяснил, с какой проблемой столкнулся, это называется Texture /Pixel bleeding , о котором я еще не знал. Я написал ниже ответ, состоящий из небольшого описания проблемы и ссылки на сообщение, что я очень хорошо объяснил проблему.


Я создаю для себя небольшой движок (хорошо, скажем, рамки), чтобы учиться с помощью DirectX 11. Я доволен результатами до сих пор, но сегодня у меня возникла небольшая проблема, которую я не смог решить. При рендеринге текстурированной модели наблюдаются уродливые пробелы в некоторых видимых многоугольных суставах. Я расскажу о проблеме более четко с изображениями примера, который я показываю на данный момент. Моя модель состоит из простых кубоидов, одна из которых использует следующую часть UV-карты (отмеченные вершины и треугольники желтым цветом, чтобы уточнить, линии и точки на самом деле не являются частью текстуры).

! [введите описание изображения здесь>> </a> </p>

<p> (Как вы можете видеть, кубик имеет 14 вершин </p>

<p> Теперь я хочу отобразить пиксели дискретными. Это означает: не сглаживайте пиксели. Выполняя это, я получил визуальные проблемы, увиденные на скриншоте ниже. Это скриншот края, где встречаются два треугольника.
<a href=введите описание изображения здесь

(Когда я использую сглаженные пиксели с помощью линейного фильтра при создании пробоотборника Описание нет реальных пробелов, но на краях плоскости влияет цвет, который был бы зазор)

Как вы можете видеть, между многоугольниками существует разрыв. Соответствующее пятно на карте uv отмечено красным на верхнем изображении. Это поведение наблюдается в каждом месте, встречаются два многоугольника, которые не смежны на УФ-карте. Также обратите внимание на то, что промежуток частично заполнен оранжевым /розовым цветом, рядом с полигоном на УФ-карте (пиксели других сеток, в этом случае правая рука).

Шаги, которые я предпринял, чтобы найти решение:

  • Сначала я подумал, что это может быть вызвано неточностями поплавка. Перемещение каждой вершины немного (минимум, поплавок может кодировать) внутри UV-Map, вероятно, решит проблемы. Но я думаю, что это было бы одним из способов обхода и не может быть решением.
  • Изменена текстура 16x16 (вместо 13x12), потому что я думал, что это уменьшит неточности с помощью float, но это мало помогло.
  • Я думал, что изменение фильтрации на что-то другое может помочь, но мне не повезло.
  • Я даже пытался изменить координаты uv внутри Pixel Shader, но это было обречено на провал и привело к некоторым странным (но в некотором смысле смешным) результатам.
  • Взаимодействовал с различным ключевым словом, но не смог найти ничего, что могло решить эту проблему.
  • Когда я тестировал рисование в виде каркаса, край был нарисован оранжевым /розовым.

Я, вероятно, не вижу здесь очевидного, но как я могу исправить это и избавиться от пробелов?
Я triple проверил, что все данные вершин (x | y | z и u | v) верны. Есть ли какой-либо фильтр, который я пропускаю? Или мне даже нужно использовать некоторые неприятные обходные пути (например, окружающие фактическую текстуру на карте uv с добавлением ряда правильно цветных пикселей)? Я хотел бы разрешить это, прежде чем продолжать.

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

В случае, если это актуально, это данные для 4 вовлеченных вершин (нумерация, как показано выше). Первый вектор - это x | y | z, второй - u | v:

vertices[ 0] = { { -1, -1.5f, .5f },{  9.f / 16.f, 5.f / 16.f }};
vertices[ 1] = { {  1, -1.5f, .5f },{ 11.f / 16.f, 5.f / 16.f }};

vertices[11] = { { -1, -1.5f, .5f },{  8.f / 16.f, 4.f / 16.f }};
vertices[12] = { {  1, -1.5f, .5f },{  6.f / 16.f, 4.f / 16.f }};

 введите описание изображения здесь>> </a> <br>
(Снимок экрана полной модели в случае, если внешний вид всего неясно. Также есть фрагменты, видимые в голове и в верхней части руки.) </p></body></html>

4 голоса | спросил LukeG 21 62015vEurope/Moscow11bEurope/MoscowSat, 21 Nov 2015 02:11:50 +0300 2015, 02:11:50

1 ответ


1

После гораздо большего исследования выяснилось, что источником этих «пробелов» было. Они на самом деле не являются пробелами, они являются эффектами пиксельных /текстурных кровотечений (я не знал об этой проблеме).


Что такое кровотечение текстуры?

Утечка текстуры - это эффект значений цвета соседних пикселей в UV-карте /текстуре, «истекающей кровью» в вашем полигоне. При использовании линейной фильтрации он изменяет отображаемые цвета по краям многоугольника. Если вы не используете фильтр, на краях появляется небольшая строка смежного цвета (как в моем случае, см. Фотографии в вопросе).


Как решить /избежать этого?

Существует множество способов избежать этого, в зависимости от конкретного случая.

  • Окружать пиксели UV-карты, по крайней мере, одним дополнительным пикселем (если вы используете линейную фильтрацию или другие фильтры, которые вы должны добавить больше)
  • Для плиток, заполняющих всю текстуру, вы можете использовать D3D11_TEXTURE_ADDRESS_CLAMP (или эквивалент OpenGL), поэтому вам не нужна дополнительная строка. (При использовании текстурного атласа для плиток я бы предложил извлечь плитки в качестве отдельных ресурсов для текстуры).

Если вы хотите узнать больше об этом, я бы рекомендовал этот форум: Нажмите


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

ответил LukeG 23 12015vEurope/Moscow11bEurope/MoscowMon, 23 Nov 2015 22:05:46 +0300 2015, 22:05:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132