Рисование смежных прямоугольников с отображением текстуры в OpenGL

#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, некоторые артефакты, должно быть, исчезли, а прозрачные пиксели появились в виде пробелов.