Использование кадрового буфера для размытия по Гауссу 2 прохода

Я хочу применить размытие по Гауссу в текстуре 256×256, но у меня возникают проблемы с передачей первого прохода в кадровый буфер и его повторным использованием, что приводит к получению части изображения, которая выглядит как преобразованная текстура.

Привлекает внимание

вершинный шейдер:

void main()
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}

фрагментный шейдер:
Я удалил всю часть размытия только для тестов.

uniform sampler2D texture_0;
uniform float switcher;
vec4 cor;

void main()
{
cor = vec4(0.0,0.0,0.0,0.0);
vec2 position = gl_TexCoord[0].xy;

cor = texture2D(texture_0,position);

gl_FragColor = cor;
}

инициализация:

glGenTextures( 1, &tex1 );
glBindTexture( GL_TEXTURE_2D, tex1 );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img1->getWidth(),img1->getHeight(), 0,GL_RGB,     GL_UNSIGNED_BYTE, data1);
glBindTexture(GL_TEXTURE_2D, 0);glGenTextures( 1, &tex2 );
glBindTexture( GL_TEXTURE_2D, tex2 );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img1->getWidth(),img1->getHeight(), 0,GL_RGB,  GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE0);
glBindTexture( GL_TEXTURE_2D, tex1 );
glActiveTexture(GL_TEXTURE1);
glBindTexture( GL_TEXTURE_2D, tex2 );

glGenFramebuffers(1,&framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER,framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2,0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

визуализации:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glUniform1i(loc_u_texture_0, 0);
glUniform1f(loc_switcher_1, 0);

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

glNormal3f(0, 1, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(-2, -2,  -10);
glTexCoord2f(1, 0);
glVertex3f(2, -2,   -10);
glTexCoord2f(1, 1);
glVertex3f(2, 2,  -10);
glTexCoord2f(0, 1);
glVertex3f(-2, 2, -10);
glEnd();

glBindFramebuffer(GL_FRAMEBUFFER, 0);
usleep(50);

glUniform1i(loc_u_texture_0, 1);
glUniform1f(loc_switcher_1, 1);

glNormal3f(0, 1, 0);
glBegin(GL_QUADS);

glTexCoord2f(0, 0);
glVertex3f(-2, -2,  -10);
glTexCoord2f(1, 0);
glVertex3f(2, -2,   -10);
glTexCoord2f(1, 1);
glVertex3f(2, 2,  -10);
glTexCoord2f(0, 1);
glVertex3f(-2, 2, -10);
glEnd();

glutSwapBuffers();

1

Решение

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

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();

Когда вы сбрасываете матрицы проекции и матрицы вида, ваши примитивы не преобразуются, и вы можете непосредственно рисовать объекты в отсечном пространстве (это куб с углами (-1, -1, -1) и (1,1,1) ).

Кроме того, не используйте следующее:

glActiveTexture(GL_TEXTURE1);
glBindTexture( GL_TEXTURE_2D, tex2 );

если вы не собираетесь использовать более одного входного сэмплера на шейдер одновременно, вам нужен только первый канал текстуры GL_TEXTURE0, который установлен по умолчанию.

0

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

Других решений пока нет …

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