как плавно отобразить текстуру на сетку из плиток?

#opengl #mapping #textures

#opengl #отображение #Текстуры

Вопрос:

У меня есть сетка размером 8 х 8 точек, и я хочу наложить на нее изображение. Я делю внутреннюю сетку размером 6 X 6 на 4 равные части размером 3 X 3 каждая. Давайте назовем эту часть как tile. Идея состоит в том, чтобы отобразить эти плитки вместе с соответствующими им текстурами. Я разделяю сетку на плитки, потому что в будущем хочу протестировать ее на сетке большего размера. Я сделал это, используя следующий подход, но у меня получаются швы по краям. Я не могу понять, почему появляются швы.

Сначала плитки имеют соответствующие начальные координаты в виде {(0,0),(0,3),(3,0),(3,3)}.

У меня есть изображение размером 8 X 8, которое я хочу наложить на super_grid, и я сохраняю его значения rgba в некоторых super_data (8 X 8).

При рендеринге плиток я рисую их в виде квадратов, а затем накладываю на них соответствующую текстуру. Итак, если (a, b) запускают координаты для конкретной плитки, то я инициализирую квадратные вершины = {(a-0.5,b-0.5),(a 3-0.5,b-0.5),(a 3-0.5,b 3-0.5),(a-0.5,b 3-0.5)} и если xs = 1 / (ширина плитки 1)=1/(3 1)=1/4 если ys = 1 / (высота плитки 1) = 1/4, то координаты текстуры равны {(xs /2, ys / 2),(1-xs / 2,ys / 2), (1-xs /2,1-ys / 2), (xs /2,1-ys / 2)}

Итак, для первой плитки,

 quadVertices={(-0.5,-0.5),(3.5,-0.5),(3.5,3.5),(-0.5,3.5)}
textureCoords={(1/8,1/8),(1-1/8,1/8),(1-1/8,1-1/8),(1/8,1-1/8)}.
  

Перед передачей текстуры для плитки я инициализирую текстуру: int image = new int [Ширина плитки 2] [Высота плитки 2] с помощью super_data. Мы берем эти размеры, потому что некоторая часть текстуры плитки перекрывается с соседними плитками (именно по этой причине мы учитываем эту часть при вычислении квадратиков).

Наконец, для создания текстуры используйте

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tileWidth   2, tileHeight   2, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  

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

Ответ №1:

Включено ли у вас сглаживание полигонов? Попробуйте отключить это:

 glDisable(GL_POLYGON_SMOOTH)
  

Ответ №2:

Попробуйте GL_CLAMP_TO_EDGE вместо GL_CLAMP .

Ответ №3:

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

Вторая часть проблемы — сама текстура. Убедитесь, что текстура будет выложена правильно при ее размещении. Это становится сложнее с перекрывающимися плитками; обычно вы просто следите за тем, чтобы края правильно совпадали.

Комментарии:

1. При вычислении края должны правильно совпадать. Одна вещь, которую я заметил, это то, что если я заменю xs / 2 просто на xs при вычислении координат текстуры, то я не получу швов, но это неправильный способ, поскольку мы растягиваем исходную текстуру на xs / 2 со всех углов.