Артефакт текстури Skybox на краю


12

У мене є дивна проблема з малюванням текстури skybox на 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);

У чому може бути проблема?

Знімок екрана:

Зображення неба із видимими краями skybox

Редагувати:

Я намагався встановити колір тла червоним, щоб переконатися, що він кровоточить через текстуру

Я також намагався змінити координати текстури на це:

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);

Я знайшов помилку! GL_CLAMP_TO_EDGE потрібно було не встановлювати для кожної текстури куба, а для самого cubemapp! 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);
martin pilch

1

вставте "0,5f / text_width" з лівої та правої сторони текстури та "0,5f / text_height" зверху та знизу. Ви бачите артефакти для відбору проб - пробовідбірники текстури зазвичай відбирають з центру текстилю, тому зліва та справа, вгорі та внизу (0 і 1 uv), ви отримуєте 50% того, що отримує тексель, який отримує ваш пробовідбірник, коли він знаходиться поза межами . Це або інша сторона текстури, або колір вибірки за замовчуванням.


Ось чому він отримав GL_CLAMP_TO_EDGEнабір, він повинен зробити так, щоб зразки вийшли за межі приймали значення найближчих за текстурою пікселів. Те, що ви описуєте, може дуже добре працювати, але це не пояснює, чому проблема в першу чергу.
aaaaaaaaaaaa

Я спробував це без змін: /
martin pilch

0

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

Брудне рішення для злому було б зробити всі квадратики занадто великими, щоб вони перекривались і стискали один одного і відповідно регулювали УФ-координати.


Я намагався вимкнути функцію згладжування (від glDisable (GL_POLYGON_SMOOTH);) без ефекту. Я малюю skybox у вигляді трикутної стрічки з координатами форми від 1 до 1
мартін-піхч

1
Це мені добре звучить. Принаймні, поки що я не здогадуюсь, але ви, можливо, захочете усунути проблему, дізнавшись, чи є чорний фон, що кровоточить наскрізь, або край текстури, показаний як чорний. Якщо ви помістите червоний багатокутник десь за артефактом, чи буде артефакт його кольором?
aaaaaaaaaaaa

Я хочу спробувати розширити стіни, щоб вони перекривались (так, як писав електронний бізнес) - я думаю, що 0,0001 було б достатньо. Вам не доведеться змінювати координати УФ.
zacharmarz

1/10000, звичайно, недостатньо, величина проблеми, схоже, знаходиться в діапазоні від 1/4 до 1/2 пікселя, тому залежно від розміру текстури мінімальна величина для цього буде приблизно 1/1000. Якщо не коригувати УФ-координати, це якось неохайно, враховуючи характер текстури, то отриманий зоровий стрибок може бути не помітний, але все одно буде неправильним. У будь-якому випадку, подальша порада щодо хаків повинна залежати від відповіді на питання, яке я задав у своєму попередньому коментарі.
aaaaaaaaaaaa

Артефакт не є фоновим кровотоком через текстуру. Я встановив колір тла червоний без змін. Я також спробував розширити координати текстур
martin pilch

0

Це звичайна проблема з кубічними картами на старих HW (або, можливо, в iphone). Перевірте наявність

GL_ARB_seamless_cube_map

розширення, якщо воно доступне на вашій hw. Якщо так. Проблему можна вирішити, використовуючи її.


Проблема в GeForce 9400M, а не в iPhone. Це розширення недоступне для мене.
martin pilch

Це, безумовно, НЕ проблема, викликана кубічними картами, незалежно від того, бути безшовною чи ні. Це питання обгортання текстур.
Тара

0

Чи встановлено шість текстур, зокрема, як кубикова карта, або кожна з граней skybox відображається окремо зі своєю власною текстурою? Я чув, що деякі ранні комп'ютерні системи мали досить погану фільтрацію, коли справа стосувалася обробки кубічних карт, оскільки вони не обов'язково фільтрували від однієї фактури обличчя до другої, коли ви взяли проби біля країв куба. AFAIK SGX (iphone GPU) повинен правильно фільтрувати по краях.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.