Как отключить фильтрацию OpenGL при масштабировании текстур?

У меня уже есть эти строки здесь, когда я загружаю текстуру:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Но когда я масштабирую изображение здесь во время рендеринга:

glTexCoord2d(0.0,0.0);
glTexCoord2d(0.0454,0.0);
glTexCoord2d(0.0454,1.0);
glTexCoord2d(1.0,1.0);

Я получаю очень плохую фильтрацию текстуры (текстура — это спрайт-лист с несколькими кадрами, и я бы не стал создавать отдельный файл для каждого кадра).

2

Решение

Вы делаете это правильно с точки зрения фильтрации текстур. Однако этого недостаточно, чтобы избежать всех артефактов выборки, особенно если вы перемещаете свои спрайты. Вы также должны убедиться, что:

  • Размер ваших спрайтов в пикселях (на экране) является целым кратным их размеру в текселях (в текстуре)
  • Вы рисуете свои спрайты с интегральными координатами в пикселях (или с половиной целых, в зависимости от того, как OpenGL позиционирует тексели в текстурах, я не могу вспомнить)

Чтобы проиллюстрировать проблему, скажем, у вас есть спрайт 32×32 (в текстуре), и вы отображаете его на квадраторе 43×43 пикселей на экране. Тогда графический процессор имеет только 32 текселя для заполнения шириной 43 пикселя, поэтому ему необходимо дублировать некоторые тексели. Какие именно тексели будут дублироваться, будет зависеть от координат вашего квадратора на экране (если вы используете нецелые координаты). Таким образом, движущиеся спрайты будут иметь странно мерцающие цвета, так как графический процессор решает дублировать различные тексели, чтобы заполнить ваш квад.

Чтобы избежать этой проблемы и добиться самых привлекательных спрайтов, вы действительно хотите, чтобы каждый тексель отображался в один пиксель на экране. Если вы делаете это, то с помощью GL_NEAREST или же GL_LINEAR больше не будет иметь значения, поскольку каждый пиксель будет использовать цвет только от одного текселя.

5

Другие решения

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

Если вы пытаетесь получить доступ к заданному (квадратному) субрегиону текстуры, то я ожидаю, что ваши texCoords будут выглядеть примерно так:

float x, float y; // position of the sprite in the texture
float height, float width; // size of the sprite in the texture
glBegin(GL_TRIANGLE_STRIP)
// lower left
glVertex3D(...)
glTexCoord2d(x, y);
// lower right
glVertex3D(...)
glTexCoord2d(x, y + width);
// upper left
glVertex3D(...)
glTexCoord2d(x + height, y);
// upper right
glVertex3D(...)
glTexCoord2d(x + height, y + width);
glEnd()
1

По вопросам рекламы [email protected]