Framebuffer обрезает все, что нарисовано «за кадром»

Недавно я реализовал функцию увеличения / уменьшения масштаба в моем простом 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

Ширина и высота кадрового буфера теперь совпадают с шириной и высотой экрана, но есть лишь небольшая часть графики, то есть небольшая часть, к которой фактически обращается.

У кого-нибудь есть подсказка? Если понадобится больше порций кода, я с радостью согласен, но все это слишком много.

0

Решение

Задача ещё не решена.

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector