Как избавиться от наложения текстурного шва? - PullRequest
1 голос
/ 26 января 2011

Посмотрите на следующее изображение - вы увидите, что облака на заднем плане имеют очень раздражающий шов:

http://simoneschbach.com/seam.png

Этот шов возникает, когда происходит наложение,так как я передаю координаты текстуры программно с помощью следующего кода:

gBackgroundPos += 0.0003f;  // gBackgroundPos climbs indefinitely...
GLfloat bgCoords[] = {  gBackgroundPos, 1.0, 
            gBackgroundPos + 0.5f,  1.0, 
            gBackgroundPos, 0.0, 
            gBackgroundPos + 0.5f,  0.0  };

Я включил наложение текстуры во время инициализации текстуры следующим образом:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

Что я могу сделать здесь, чтобы избавиться оточень видимый шов?

Ответы [ 5 ]

4 голосов
/ 12 августа 2012

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

http://vcg.isti.cnr.it/~tarini/no-seams/

По этой ссылке находится демонстрационная программа с открытым исходным кодом, которая предоставляетиспользуется фрагментный шейдер.

Этот трюк легко принять даже без полного понимания того, почему он работает, но он полностью объяснен в статье журнала графических инструментов: «Цилиндрические и тороидальные параметризации без вершинных швов», которые могутнапример, в http://vcg.isti.cnr.it/Publications/2012/Tar12/.

К сожалению, другие решения, перечисленные здесь, не будут работать:

  • GL_REPEAT (как GL_TEXTURE_WRAP), один, делает не делай то, что тебе нужно.Проблема, как отмечалось, заключается в том, что треугольная точка соединения с S = 0,9 и S = ​​0,1 интерполируется полностью назад по цилиндру, а не вперед по шву.

  • Репликация вершин на«разрез» (шов текстуры) будет работать со статическими геометриями, где координаты текстуры отправляются как атрибуты (но даже тогда недостатков много: вводится репликация и швы нарушают геометрию: две стороны разреза текстуры будутбыть топологически отключенным).В этом конкретном случае текстурные координаты создаются процедурно , так что это даже не вариант.

3 голосов
/ 08 декабря 2011

Это старый вопрос, но мне недавно пришлось столкнуться с той же проблемой.

Когда текстура обтекает, скажем, цилиндр, возникает естественный шов там, где сходятся края карты.

Полоса треугольников, пересекающих эту границу, имеет координаты текстуры, которые заставляют рендерер сжимать всю текстуру назад в эти треугольники.

Просто глядя на координату U: треугольник, который не пересекает край текстуры, будет иметь координаты текстуры в направлении против часовой стрелки.Однако, когда треугольник пересекает границу (например), вы попадаете с противоположным порядком намотки, потому что точка, пересекающая границу, отображается обратно на противоположную сторону текстуры.Обычно вы видите треугольник с одной или двумя текстурными координатами в диапазоне 0,9-0,9999 U, а остальные координаты в диапазоне 0-0,1.

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

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

Обратите внимание, что вы не изменяете значения XYZ для вершины: просто UV.

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

2 голосов
/ 26 января 2011

Я бы проголосовал за Шезана Бэйга, если бы этот комментарий был ответом.

GL_REPEAT предназначен для выполнения именно того, что вы хотите. Если это не так, то, скорее всего, потому что ваша текстура содержит шов или, наоборот, инструментальная цепочка, которая загружает текстуру, вводит шов (скажем, потому что исходная текстура не имеет степень двух размеров, например).

1 голос
/ 26 января 2011

Это только предположение, оно может не сработать. Вы пытались изменить GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER между GL_LINEAR и GL_NEAREST? Кроме того, вы включили mipmaps (например, с помощью gluBuild2DMipmaps)? Если у вас есть, попробуйте отключить их.

0 голосов
/ 26 января 2011

Вы можете использовать преимущества текстурных границ (2 ^ m + 1 x 2 ^ n + 1 текстур, а не 2 ^ mx 2 ^ n) и копировать данные с противоположной стороны в пиксели границы, чтобы сделать текстура циклическая.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...