Я хочу привязать две точки рендеринга к 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);
Я просто получаю черный пустой экран
Я хочу привязать две цели рендеринга к fbo по умолчанию, поэтому я могу отобразить сразу две цели.
Там нет значения по умолчанию FBO. Существует фреймбуфер по умолчанию, и именно тот, который предоставляется с помощью drawable, связывает ваш контекст (как правило, с окном). Вы не можете прикреплять буферы текстур/рендеринга к FB по умолчанию, а GL_COLOR_ATTACHMENT
недействительны для glDrawBuffer
в FB по умолчанию. Таким образом, ваш код просто произведет некоторые ошибки GL и продолжит рендеринг в режиме одиночного рендеринга, до того, что ранее был установлен буфер буфера.
Поскольку нет стандартного offscreen fbo, вам нужно реализовать схему пинг-понга в вашем коде, а затем использовать FBO в качестве входной текстуры для отображения чертежа. Вы можете взглянуть на простой код в sgxperf для рабочего примера настройки FBO и использования его для отображения на дисплее, gist здесь https://gist.github.com/prabindh/8173489
GL_NONE
в таких случаях. Если вы почему-то думаете, что прикрепление текстуры 0 к некоторому FBO и в конечном итоге снова делаете рендеринг в FB по умолчанию, вы ошибаетесь. Вы либо рендеритесь к некоторому FBO, либо к FB по умолчанию, и cen никогда не смешивают оба.