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

0

Я хочу привязать две точки рендеринга к 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);

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

Теги:
opengl
framebuffer
fbo

2 ответа

1

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

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

  • 0
    Я обновил код, добавил две строки для создания и привязки fbo и две строки для отмены привязки и удаления fbo. Но теперь я получаю пустой экран.
  • 0
    @ user2798943: Конечно. Потому что теперь вы рендеритесь в текстуры, а не на экран. Я не знаю, чего вы пытаетесь достичь, но то, что вы сейчас делаете, не имеет смысла. В качестве примечания: Включение буфера рисования для некоторых цветовых вложений, где ничто не связано (ваш случай «0»), приведет к недопустимому состоянию. Вы можете использовать GL_NONE в таких случаях. Если вы почему-то думаете, что прикрепление текстуры 0 к некоторому FBO и в конечном итоге снова делаете рендеринг в FB по умолчанию, вы ошибаетесь. Вы либо рендеритесь к некоторому FBO, либо к FB по умолчанию, и cen никогда не смешивают оба.
Показать ещё 2 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню