прикрепить два изображения в FBO для рендеринга MRT

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

void render(struct glhexbutton *_this, GLuint target0, GLuint target1)
{
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  };

GLuint fbo;

struct {
int x;
int y;
} position;/*Load variables into shader program*/
glUniform4f(glhexbutton_static.uni_address, 1.0, 1.0, 1.0, 1.0);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _this->data.texture);
glUniform1i(glhexbutton_static.uni_texture, /*GL_TEXTURE*/0);
glBindTexture(GL_TEXTURE_2D, 0);

glUseProgram(_this->data.static_data->program);

/*create fbo and attach render targets*/

glGenFramebuffers(1, &fbo);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
target0, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
target1, 0);

/*Set the viewport of the fbo*/

position.x = glutGet(GLUT_WINDOW_WIDTH)*_this->data.position.relative.x+_this->data.position.offset.x;
position.y = glutGet(GLUT_WINDOW_HEIGHT)*_this->data.position.relative.y+_this->data.position.offset.y;
glViewport(position.x, position.y,
_this->data.size.width, _this->data.size.height);

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

glDrawBuffers(2, buffers);glEnableVertexAttribArray(_this->data.static_data->att_coord);
glVertexAttribPointer(_this->data.static_data->att_coord,
2,
GL_FLOAT,
GL_FALSE,
0,
vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
glDisableVertexAttribArray(_this->data.static_data->att_coord);glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(GL_FRAMEBUFFER, &fbo);
}

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

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

мой пиксельный / фрагментный шейдер:

#version 330
uniform sampler2D texture;
uniform vec4 address;
varying vec2 f_coord;
void main() {
gl_FragData[0]=texture2D(texture,f_coord);
gl_FragData[1]=address;
if(texture2D(texture,f_coord).a == 0.0)
discard;
}

Когда я звоню

render(glhexbutton, 0, texture);

или же

render(glhexbutton, texture, 0);

Я просто получаю черный пустой экран

0

Решение

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

Есть нет по умолчанию FBO. Eсть кадровый буфер по умолчанию, и это тот, который предоставлен drawable, с которым вы связываете свой контекст (обычно окно). Вы не можете прикрепить текстуры / буферы рендеринга к FB по умолчанию, и GL_COLOR_ATTACHMENTs не действительны для glDrawBuffer в FB по умолчанию. Таким образом, ваш код просто выдаст несколько ошибок GL и продолжит рендеринг в режиме одиночного целевого рендеринга, который был ранее установлен в буфере рисования.

1

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

Поскольку внеэкранного fbo по умолчанию нет, вам необходимо реализовать схему пинг-понга в своем коде, а затем использовать FBO в качестве входной текстуры для отображения чертежа. Вы можете взглянуть на простой код в sgxperf для рабочего примера настройки FBO и использования его для рендеринга на экран, суть здесь https://gist.github.com/prabindh/8173489

0

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