OpenGL texture atlas bleeding

Я пытаюсь нарисовать базовую 2d сетку земли, состоящую из мелких плиток из атласа текстур (обратите внимание на прозрачную границу в 1 пиксель):

enter image description here

Я рендерю плитки как квады текстур, используя следующий код:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(2, GL_SHORT, 0, &m_coords[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &m_uvs[0]);

glDrawArrays(GL_TRIANGLES, 0, m_coords.size() / 2);

glBindTexture(GL_TEXTURE_2D, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

Позиции, очевидно, являются целочисленными координатами. UV-координаты для углов рассчитываются следующим образом:

u0 = float(x) / float(texWidth);
v0 = float(y) / float(texHeight);
u1 = float(x+w) / float(texWidth);
v1 = float(y+h) / float(texHeight);

Где w и h - размер плитки без подкладки.

Это выглядит отлично, когда трансформация modelview привязана к целочисленной позиции (справа), но когда она начинает двигаться, я получаю черные штуки между плитками (слева):

enter image description here

Насколько я понимаю, я должен сместить UV координаты на половину текселя, чтобы это работало, но если я изменю UV расчеты на:

u0 = float(x+0.5f) / float(texWidth);
v0 = float(y+0.5f) / float(texHeight);
u1 = float(x+w-0.5f) / float(texWidth);
v1 = float(y+h-0.5f) / float(texHeight);

Это все равно не работает. Правильно ли это? Нужен ли мне блендинг, чтобы это работало? Если я сместил плитки, чтобы убедиться, что они привязаны к пиксельной сетке, это работает, но это заставляет его щелкать при медленном движении. Как люди обычно решают эту проблему?

EDIT

Я, конечно, должен был сказать, что это на iphone.

6
задан genpfault 23 December 2011 в 17:57
поделиться