首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FBO -雪碧倒置版

FBO -雪碧倒置版
EN

Stack Overflow用户
提问于 2012-09-30 07:53:52
回答 1查看 2.3K关注 0票数 9

嗯,FBO的使用范围很广,它有助于使复杂的效果更容易。我设置FBO并绘制到它,然后渲染FBO纹理四,没有任何问题,甚至测试简单的屏幕处理彩色着色。但我给FBO的一切都因为某种原因被颠倒了。如果我渲染到股票屏幕FBO一切都是正常的,我甚至不执行任何旋转的雪碧。

FBO创建

代码语言:javascript
复制
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);
}

FBO使用

代码语言:javascript
复制
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));
}

结果:

带有灰度着色器的结果:

不带FBO的呈现:

代码语言:javascript
复制
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));
}

EN

回答 1

Stack Overflow用户

发布于 2012-10-30 16:00:07

从评论中汇总:

之所以会出现这种情况,是因为OpenGL的原点位于左下角,与大多数正在使用的窗口系统不同,后者的原点位于左上角。

只要确保纹理坐标从左上角的0,1到右下角的1,0,就可以正确地绘制FBO,或者用垂直翻转的纹理绘制四角体。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12659643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档