#opengl #textures #texture-mapping
#opengl #Текстуры #отображение текстуры
Вопрос:
Я рисую несколько прямоугольников с отображением текстуры, которые расположены друг на друге, используя следующий код:
glBegin(GL_QUADS);
glTexCoord2f(0.0, 1.0); glVertex3f(x, y, 0);
glTexCoord2f(0.0, 0.0); glVertex3f(x, y dy, 0);
glTexCoord2f(1.0, 0.0); glVertex3f(x dx, y dy, 0);
glTexCoord2f(1.0, 1.0); glVertex3f(x dx, y, 0);
glEnd();
Это корректно отображает в полном размере, но когда я изменяю его с помощью glScale
, между некоторыми прямоугольниками появляются промежутки в один пиксель.
Однако, если я удаляю текстурную карту, прямоугольники всегда правильно прилегают друг к другу.
Что происходит не так, и как я могу это исправить?
Комментарии:
1. кажется правильным. можете ли вы опубликовать код, в котором вы масштабируете?
2. @0verbose Я не стал утруждать себя публикацией этого, потому что это довольно просто. Я просто вызываю это перед приведенным выше кодом:
glScale(scalex, scaley, 1);
(scalex и scaley оба являются GLfloats со значениями < 1).3. Как вычисляются x, y, dx и dy?
4. @Bahbar x, dx и dy являются постоянными. y устанавливается в начальное значение, а затем после каждого вызова приведенного выше кода появляется строка:
y -= dy
.5. КАК сказал @Paul-Jan, откуда вы знаете наверняка, что это пробелы, а не артефакты текстуры? Можете ли вы поделиться рисунком?
Ответ №1:
Как выглядит текстура? Возможно, вам придется использовать другой режим зажима, в зависимости от содержимого текстуры.
Комментарии:
1. По сути, это просто простые белые прямоугольники с небольшим затенением по краям для придания им глубины. Я использую
GL_CLAMP_TO_EDGE
, но изменение этого, похоже, не имеет никакого эффекта.
Ответ №2:
Прежде всего, убедитесь, что это действительно пробелы, а не артефакты текстуры, не используя какой-либо альфа-канал (при условии, что вы им были) и выбрав цвет фона, который выделяется, как больной палец.
Даже если вы указали текстурирование как основную причину, гораздо более вероятным виновником являются ошибки округления в координатах вершин. Растрирование смежных треугольников гарантированно без пробелов, только если используемые координаты вершин совпадают на 100%. Вместо того, чтобы вычислять их «на лету» (x dx, y dy), почему бы не сохранить их в массиве и не убедиться, что вы повторно используете те же координаты?
Комментарии:
1. Изначально я думал, что вероятной причиной была ошибка округления, но если это так, я не понимаю, как комментирование
glTexCoord2f
вызовов может привести к исчезновению пробелов.
Ответ №3:
Я идиот. Изображения, которые я использовал, на самом деле имели прозрачный ряд пикселей сверху и снизу.
Первоначальный «полноразмерный» рендеринг уже изменял размер текстуры, и это была чистая случайность, что изменение размера артефактов привело к тому, что прозрачные строки в этом случае не отображались.
Затем, когда я снова изменил размер всего участка с помощью glScale, некоторые артефакты, должно быть, исчезли, а прозрачные пиксели появились в виде пробелов.