Недавно я реализовал функцию увеличения / уменьшения масштаба в моем простом 2D-движке и обнаружил несколько ужасных швов между смежными текстурами, как показано здесь:
http://oi59.tinypic.com/anmxyf.jpg
Это не выглядит так плохо, но это определенно раздражало, когда постоянно моргало при движении.
Я решил изменить это так, чтобы очень большая часть игры (столько, сколько игроку разрешено уменьшать) вместо этого рисовалась на кадровом буфере, затем я печатаю кадровый буфер, а при увеличении или уменьшении он вместо этого увеличивает / уменьшает кадровый буфер Размер текстуры, чтобы избежать швов.
Сначала я решил нарисовать в 5 раз больше, чем видно игроку при увеличении по умолчанию, поэтому я создал объект кадрового буфера с текстурой в 5 раз больше, а затем нарисовал его.
Вот инициализация объекта кадрового буфера:
glGenFramebuffers(1, &main_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, main_framebuffer);
glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
glGenTextures(1, &main_ColorBuffer);
glBindTexture(GL_TEXTURE_2D, main_ColorBuffer);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA, SCREEN_BUFFER_WIDTH, SCREEN_BUFFER_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL
);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, main_ColorBuffer, 0
);
Где SCREEN_BUFFER_WIDTH и SCREEN_BUFFER_HEIGHT установлены в пять раз больше размера экрана по умолчанию. Затем я рисую свой мир, как я обычно делаю (где я могу уменьшить столько, сколько я хотел, и все было хорошо, кроме швов).
Проблема в том, что в кадровый буфер отрисовывается только 1024 x 768 (размер экрана по умолчанию). Вот как я активирую, рисую в буфере кадров, а затем рисую в буфере кадров:
glBindFramebuffer(GL_FRAMEBUFFER, main_framebuffer);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw_blocks(); //draws all the blocks in the correct screen y and x positionglBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, main_ColorBuffer);
draw_quad(shift_y*ratio, shift_x*ratio, SCREEN_BUFFER_WIDTH*ratio, SCREEN_BUFFER_HEIGHT*ratio);
glBindTexture(GL_TEXTURE_2D, 0);
Где отношение — это число с плавающей точкой, которое я использую для увеличения и уменьшения масштаба, а shift_y и shift_x я использую для перемещения текстуры кадрового буфера, чтобы лучше понять, как идут дела.
Немного уменьшив и сдвинув кадровый буфер, я получаю следующее:
http://oi61.tinypic.com/34zlpip.jpg
он лишь рисует небольшую часть экрана (которая точно соответствует экрану, если я не уменьшаю масштаб).
Напротив, вот как это выглядит, если я полностью уменьшу (а затем и немного) перед использованием кадрового буфера и вместо этого буду рисовать прямо на экране:
http://oi61.tinypic.com/21akbit.jpg (пустые части — это просто куски, которые не были загружены, так как игрок не должен был так сильно уменьшать масштаб).
Я действительно в тупике, я пытался изменить область просмотра перед рисованием, но это ничего не дает.
Я также хотел бы отметить, что я вполне уверен, что фактический объект текстуры кадрового буфера на самом деле в пять раз больше того, что рисуется к нему, потому что если я не растяну его в моей функции draw_quad, вместо этого присвоив ему ту же ширину и высота как экран, я получаю это:
http://oi62.tinypic.com/4triiu.jpg
Ширина и высота кадрового буфера теперь совпадают с шириной и высотой экрана, но есть лишь небольшая часть графики, то есть небольшая часть, к которой фактически обращается.
У кого-нибудь есть подсказка? Если понадобится больше порций кода, я с радостью согласен, но все это слишком много.
Задача ещё не решена.