Скайбокс текстурный артефакт по краю

12

У меня странная проблема с рисованием текстуры скайбокса на Mac. На iPhone все идет хорошо. Я пытался изменить стоимость ближних и дальних самолетов, но безуспешно.

Это скайбокс из шести текстур, и для каждой текстуры я устанавливаю это:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

В чем может быть проблема?

Скриншот:

Изображение неба с видимыми краями скайбокса

РЕДАКТИРОВАТЬ:

Я попытался установить красный цвет фона, чтобы убедиться, что он пропускает текстуру

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

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

И коробка рисуется в следующем порядке:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

РЕШЕНИЕ:

Решение состоит в том, чтобы установить GL_CLAMP_TO_EDGE для самой кубической карты!

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Мартин Пилч
источник

Ответы:

8

Вы уверены, что вы установили GL_CLAMP_TO_EDGE для каждой отдельной текстуры ? Это часть отдельного состояния текстуры и по умолчанию GL_REPEAT, поэтому это необходимо сделать после связывания с glBindTexture. Я понимаю, что в оригинальном посте вы буквально говорите, что устанавливаете его для каждой текстуры, но мне интересно, как на самом деле выглядит код?

Например:

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

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

Это не то же самое, что:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
user_123abc
источник
Я нашел ошибку! Необходимо было установить GL_CLAMP_TO_EDGE не для каждой текстуры кубической карты, а для самого кубического приложения! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);иglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Мартин Пилч
1

вставка '0.5f / texture_width' слева и справа от текстуры и '0.5f / texture_height' сверху и снизу. Вы видите артефакты сэмплирования - сэмплеры текстуры обычно сэмплируют из центра текселей, так что слева и справа, сверху и снизу (при 0 и 1 мкВ) вы получаете 50% от тех текселей, которые получает ваш семплер, когда он выходит за пределы , Это либо другая сторона текстуры, либо цвет выборки по умолчанию.

Лютер
источник
Вот почему у него есть GL_CLAMP_TO_EDGEнабор, он должен заставить сэмплы вне границ принимать значения ближайших пикселей в текстуре. То, что вы описываете, может очень хорошо сработать, но это не объясняет, почему проблема существует в первую очередь.
аааааааааааа
Я попробовал это без изменений: /
Мартин Пилч
0

Я думаю, что разница между MAC и iPhone вызвана сглаживанием на MAC. Мое 3D-программирование немного ржавое, но я думаю, вам придется сделать все квадраты частью одной сетки или что-то в этом роде.

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

AAAAAAAAAAAA
источник
Я попытался отключить сглаживание (с помощью glDisable (GL_POLYGON_SMOOTH);) без эффекта. Я рисую скайбокс в виде треугольной полосы с координатами от -1 до 1
Мартин Пилч
1
Это звучит хорошо для меня. По крайней мере, на данный момент я не догадываюсь, но вы можете сузить проблему, выяснив, является ли этот черный фон выплескивающимся на задний план или край текстуры отображается черным. Если вы поместите красный многоугольник где-нибудь за артефактом, примет ли артефакт его цвет?
аааааааааааа
Я хочу попытаться расширить стены, чтобы они перекрывали друг друга (как писал электронный бизнес) - думаю, 0,0001 будет достаточно. Вам не нужно менять координаты UV.
zacharmarz
1/10000, конечно, недостаточно, масштаб проблемы, кажется, находится в диапазоне от 1/4 до 1/2 пикселя, поэтому в зависимости от размера текстуры минимальная величина для этой работы будет около 1/1000. Не корректировать UV-координаты довольно неаккуратно, учитывая природу текстуры, результирующий визуальный скачок может быть незаметным, но все равно будет неправильным. В любом случае, дальнейшие советы по взлому должны зависеть от ответа на вопрос, который я задал в своем предыдущем комментарии.
аааааааааааа
Артефакт - это не фон, истекающий текстурой. Я установил цвет фона на красный без изменений. Я также пытался расширить текстурные координаты
Мартин Пилч
0

Это обычная проблема с кубами на старых HW (или, может быть, iphones). Проверьте на

GL_ARB_seamless_cube_map

расширение, если оно доступно на вашем hw. Если так. Проблема будет решена с помощью этого.

NotaBene
источник
Проблема в GeForce 9400M, а не в iPhone. Это расширение не доступно для меня.
Мартин Пилч
Это определенно НЕ является проблемой, вызванной кубическими картами, независимо от того, является ли она бесшовной или нет. Это проблема обтекания текстурой.
Тара
0

Шесть текстур настроены, в частности, как карта куба, или каждая из граней скайбокса визуализируется отдельно со своей собственной текстурой? Я слышал, что некоторые ранние системы ПК имели довольно плохую фильтрацию, когда дело дошло до обработки кубических карт в том смысле, что они не обязательно фильтровали по одной текстуре лица к другой, когда вы производили выборку около краев куба. AFAIK SGX (iphone GPU) должен правильно фильтровать по краям.

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

Саймон Ф
источник