Глюк при перемещении камеры в OpenGL - PullRequest
4 голосов
/ 16 декабря 2009

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

http://img41.imageshack.us/img41/9422/movingy.png

По сравнению со стационарным (правильно):

http://img689.imageshack.us/img689/7026/still.png

Кто-нибудь знает, почему это может быть?


Спасибо за ответы до сих пор. Ошибка с плавающей точкой была моей первой мыслью, и я попытался немного увеличить размер тайлов, но это не помогло. Изменение glClearColor на красный все еще оставляет черные пробелы, поэтому, возможно, это не ошибка с плавающей запятой. Поскольку для плиток в общем случае будут использоваться разные текстуры, я не знаю, можно ли использовать вершинные массивы (я всегда думал, что одну и ту же текстуру нужно было применить ко всему массиву, поправьте меня, если я ошибаюсь), и я не думаю, что VBO доступно в OpenGL ES. Настройка фильтрации для ближайшего соседа улучшила ситуацию, но сбой по-прежнему происходит каждые десять кадров или около того, и пиксельный результат означает, что это решение в любом случае нежизнеспособно.

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

void Camera::CentreAtPoint( GLfloat x, GLfloat y )
{
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity();
 glOrthof(x - size.x / 2.0f, x + size.x / 2.0f, y + size.y / 2.0f, y - size.y / 2.0f, 0.01f, 5.0f);
 glMatrixMode(GL_MODELVIEW);
}  

Есть ли проблема с такими действиями, и если да, то есть ли решение?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2009

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

Одним из решений этой проблемы было бы сделать плитки немного больше. Требуется только очень небольшое приращение (например, 0,0001f), чтобы покрыть этот тип ошибки.

В качестве альтернативы, вы можете попробовать использовать Vertex Array или VBO для хранения вашей основной сетки (убедитесь, что смежные квадраты имеют общие вершины). Я ожидал бы, что это решит проблему, но я не уверен на 100% - и это должно также сделать быстрее.

0 голосов
/ 30 декабря 2009

Это из-за фильтрации .. используйте зажим для края И оставьте границу в 1 или 2 пикселя .. именно поэтому у нас есть опция для BORDER в вызове glTexImage ..


4-е изменение параметра от 0 до 1

0 голосов
/ 16 декабря 2009

Иногда это вызвано проблемами с фильтрацией на границах текселей. Вы можете попробовать использовать GL_CLAMP_TO_EDGE в параметрах текстуры.

...