Офф-рендеринг OpenGL Framebuffer

Я делаю проект SDL / OpenGL на MinGW Windows Code :: Blocks 12.11, используя GLEW. Я пытаюсь реализовать 2D-рендеринг вне экрана, чтобы в конечном итоге попробовать некоторые фрагменты шейдерных эффектов.

Вот сцена, отображаемая с кадровым буфером по умолчанию:

Сцена Нормальная

Однако, если я рендерим сцену в текстуру объекта Framebuffer (называемую fbo_texture), а затем пытаюсь рендерить ее в полноэкранный квад, я получаю это:

Сцена с объектом Framebuffer

Изображение выглядит перевернутым, зеркальным и зеленым. Я почти уверен, что рендеринг в Framebuffer работает правильно, но я не могу понять, почему текстура выглядит такой искаженной.

Вот как я пытался отобразить fbo_texture в текстурированный квад, после вызова glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0). Я использую glMatrixMode (GL_MODELVIEW) и glOrtho (0, screen_width, screen_height, 0, 0, 1), когда программа инициализируется. Ширина экрана равна 400, а высота экрана равна 400.

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
glBegin(GL_QUADS);
x1= 0.5;
x2= 400.5;
y1= 0.5;
y2 = 400.5;
glTexCoord2f(0.0f, 0.0f); glVertex2f(x1, y1);
glTexCoord2f(1.0f, 0.0f); glVertex2f(x2, y1);
glTexCoord2f(0.0f, 1.0f); glVertex2f(x2, y2);
glTexCoord2f(1.0f, 1.0f); glVertex2f(x1, y2);
glEnd();glDisable(GL_TEXTURE_2D);

Я действительно ценю любую помощь, пожалуйста, дайте мне знать, если я должен предоставить больше информации.

0

Решение

Возможно, это не единственная ваша проблема, но из той части, которую вы показываете, две вершины меняются местами в ваших координатах текстуры. 3-я из 4-х вершин — верхний правый угол с координатами (x2, y2)поэтому у него должны быть координаты текстуры (1.0f, 1.0f):

glTexCoord2f(0.0f, 0.0f); glVertex2f(x1, y1);
glTexCoord2f(1.0f, 0.0f); glVertex2f(x2, y1);
glTexCoord2f(1.0f, 1.0f); glVertex2f(x2, y2);
glTexCoord2f(0.0f, 1.0f); glVertex2f(x1, y2);

Вы также говорите, что звоните glOrtho() после glMatrixMode(GL_MODELVIEW), glOrtho() устанавливает матрицу проекции, поэтому ее обычно следует вызывать после glMatrixMode(GL_PROJECTION),

2

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


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