проблемы с OpenGL шейдеров с MRT

У меня есть две текстуры одинакового размера, прикрепленные к одному fbo, и я хочу визуализировать другую текстуру в одну из прикрепленных текстур, и я хочу визуализировать синюю фигуру входной текстуры в другую прикрепленную fbo текстуру.

(обновленный) вершинный шейдер:

#version 330
in vec2 coord;
out vec2 f_coord;
void main() {
gl_Position = vec4(coord, 0.0, 1.0);
f_coord = (1.0+coord)/2.0;
}

(обновленный) фрагментный шейдер:

#version 330
uniform sampler2D my_texture;
in vec2 f_coord;
out vec4 FragData[2];
void main() {
if(texture(my_texture,f_coord).a == 0.0)
discard;
FragData[0]=texture(my_texture,f_coord);
FragData[1]=vec4(0.5, 0.5, 1.0, 1.0);
}

С этим фрагментным шейдером все отлично работает. Текстура и синяя печать текстурных контуров отображаются правильно.

Вот скриншот:
http://s14.directupload.net/file/d/3487/kvkqdbl7_png.htm

Но если я хочу визуализировать текстуру в gl_FragData [1] и синий контурный штамп в gl_FragData [0]

#version 330
uniform sampler2D my_texture;
in vec2 f_coord;
out vec4 FragData[2];
void main() {
if(texture(my_texture,f_coord).a == 0.0)
discard;
FragData[0]=vec4(0.5, 0.5, 1.0, 1.0);
FragData[1]=texture(my_texture,f_coord);
}

чем я получаю две совершенно синие текстуры. Странная вещь: обе целевые текстуры полностью синего цвета, но я установил glViewport только на часть текстуры.

Вот скриншот:
http://s1.directupload.net/file/d/3487/9loqibdc_png.htm

Вложения FBO имеют половину экрана

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glutGet(GLUT_WINDOW_WIDTH)/2, glutGet(GLUT_WINDOW_HEIGHT), 0, GL_RGBA, GL_BYTE, 0);

Так что я могу вынести обе текстуры на экран для проверки.

Вот так я создал фреймбуферобъект

 void init_fbo()
{

glGenTextures(1, &fbo.texture0);
glBindTexture(GL_TEXTURE_2D, fbo.texture0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glutGet(GLUT_WINDOW_WIDTH)/2, glutGet(GLUT_WINDOW_HEIGHT), 0, GL_RGBA, GL_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glGenTextures(1, &fbo.texture1);
glBindTexture(GL_TEXTURE_2D, fbo.texture1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glutGet(GLUT_WINDOW_WIDTH)/2, glutGet(GLUT_WINDOW_HEIGHT), 0, GL_RGBA, GL_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glBindTexture(GL_TEXTURE_2D, 0);

glGenFramebuffers(1, &fbo.fbo);

glBindFramebuffer(GL_FRAMEBUFFER, fbo.fbo);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
fbo.texture0, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
fbo.texture1, 0);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

Я использую эти глобальные переменные структуры

 struct
{
GLuint fbo;
GLuint texture0;
GLuint texture1;
} fbo;

struct
{
GLuint program;

GLint uni_texture;
GLint att_coord;
} shader_fbo;

struct
{
GLuint program;

GLint uni_texture;
GLint att_coord;
} shader_screen;

И это моя функция рендеринга

 void render()
{
GLenum buffers[2];
GLfloat vertices[] = { -1.0, -1.0,
-1.0,  1.0,
1.0, -1.0,
1.0,  1.0  };GLubyte indices[] = { 0, 1, 2,
1, 2, 3  };/*render to mrt fbo*/
glUseProgram(shader_fbo.program);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture.texID);
glUniform1i(shader_fbo.uni_texture, 0);

glEnableVertexAttribArray(shader_fbo.att_coord);
glVertexAttribPointer(shader_fbo.att_coord,
2,
GL_FLOAT,
GL_FALSE,
0,
vertices);

glBindFramebuffer(GL_FRAMEBUFFER, fbo.fbo);

buffers[0] = GL_COLOR_ATTACHMENT0;
buffers[1] = GL_COLOR_ATTACHMENT1;

glDrawBuffers(2, buffers);

glViewport(0, 0,
texture.width, texture.height);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture.texID);
glUniform1i(shader_fbo.uni_texture, 0);glClear(GL_COLOR_BUFFER_BIT);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

glDisableVertexAttribArray(shader_fbo.att_coord);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);/*render both textures now to screen*/glUseProgram(shader_screen.program);

glEnableVertexAttribArray(shader_screen.att_coord);
glVertexAttribPointer(shader_screen.att_coord,
2,
GL_FLOAT,
GL_FALSE,
0,
vertices);/*render the first texture to the left side of the screen*/

glViewport(0, 0,
glutGet(GLUT_WINDOW_WIDTH)/2, glutGet(GLUT_WINDOW_HEIGHT));glClear(GL_COLOR_BUFFER_BIT);glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo.texture0);
glUniform1i(shader_screen.uni_texture, 0);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

/*render the second texture to the right side of the screen*/

glViewport(glutGet(GLUT_WINDOW_WIDTH)/2, 0,
glutGet(GLUT_WINDOW_WIDTH)/2, glutGet(GLUT_WINDOW_HEIGHT));glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo.texture1);
glUniform1i(shader_screen.uni_texture, 0);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);glutSwapBuffers();

}

2

Решение

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

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

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

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