Bueno, el uso de FBO es amplio y ayuda a que los efectos complejos sean mucho más fáciles. Ajusté FBO y dibujé en él, luego renderé el cuadrante texturizado FBO, sin ningún problema, incluso probé el sombreador de color de procesamiento de pantalla simple. Pero todo lo que represento para FBO se puso patas arriba por algún motivo. Si renderizo en la pantalla de stock FBO todo es normal, y ni siquiera hago rotaciones para sprite. creaciónDibujo a FBO - sprite invertido hacia arriba y hacia abajo número
typedef struct tex
{
dim2i size; // int width, int height
GLuint id;
} tex;
typedef struct fbo
{
GLuint frame_buffer;
tex buffer_tex;
}fbo;
void set_fbo(fbo* res, int width, int height)
{
GLint tex_size;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &tex_size);
GLint render_buffer_size;
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &render_buffer_size);
LOGI("Max render buffer size: %d, max texture size: %d", render_buffer_size, tex_size); //max render buffer size: 3838, max texture size: 2048
glGenFramebuffers(1, &res->frame_buffer);
GLuint depth_buffer;
glGenRenderbuffers(1, &depth_buffer);
glGenTextures(1, &res->buffer_tex.id);
res->buffer_tex.size.w = width;
res->buffer_tex.size.h = height;
glBindTexture(GL_TEXTURE_2D, res->buffer_tex.id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, res->buffer_tex.size.w, res->buffer_tex.size.h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, res->buffer_tex.size.w, res->buffer_tex.size.h);
glBindFramebuffer(GL_FRAMEBUFFER, res->frame_buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, res->buffer_tex.id, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_buffer);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
LOGE("BUFFER OK");
else
LOGE("BUFFER NOT OK");
//BUFFER OK
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
uso
FBO FBO
static fbo FBO;
static decor DECOR; //shield quad
static decor SCREEN_DECOR;// FBO textured quad
void on_surface_changed(int width, int height)
{
set_fbo(&FBO, width, height);
...
}
void on_draw()
{
glBindFramebuffer(GL_FRAMEBUFFER, FBO.frame_buffer);
set_render_color(YELLOW); //glClearColor(...)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw_decor(&DECOR, get_shader(SPRITE_SIMPLE_SHADER), *get_proj(ORTHO_PROJ));
glBindFramebuffer(GL_FRAMEBUFFER, 0);
set_render_color(BLACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw_decor(&SCREEN_DECOR, get_shader(SPRITE_SIMPLE_SHADER), *get_proj(ORTHO_PROJ));
}
Resultado: resultado con sombreado de escala de grises:
Dejar sin OBF:
void on_draw_simple()
{
set_render_color(YELLOW); //glClearColor(...)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw_decor(&DECOR, get_shader(SPRITE_SIMPLE_SHADER), *get_proj(ORTHO_PROJ));
}
Vea esto: http://www.java-gaming.org/index.php?topic=24126.0 Especialmente esta parte: 'Los orígenes de la textura y el origen de la ventana son la esquina inferior izquierda de OpenGL. ¿Podría ser el problema? :) – Jite
Mi mal). ¿De manera tan simple es simplemente rotar sprite a 180.0f en el eje z? – Aristarhys
no, tienes que voltear las coordenadas y al dibujar el fbo. no gire 180 ° ya que esto también reflejaría su imagen. – kritzikratzi