gpt4 book ai didi

c - 绘制到 FBO - Sprite 上下颠倒问题

转载 作者:太空狗 更新时间:2023-10-29 16:56:29 30 4
gpt4 key购买 nike

好吧,FBO 的用途很广,它有助于更​​轻松地制作复杂的效果。我设置 FBO 并绘制它,然后渲染 FBO 纹理四边形,没有任何问题,甚至测试简单的屏幕处理颜色着色器。但是出于某种原因,我呈现给 FBO 的所有内容都颠倒了。如果我渲染股票屏幕 FBO 一切正常,我什至不对 Sprite 执行任何旋转。

创建 FBO

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 使用

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));
}

结果: with FBO灰度着色器的结果: with grayscale shader

没有 FBO 的渲染:

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));
}

without FBO

最佳答案

根据评论汇总:

发生这种情况是因为 OpenGL 的原点位于左下角,这与大多数使用的窗口系统不同,后者的原点位于左上角。

只需确保纹理坐标从左上角的 0,1 到右下角的 1,0 即可正确绘制 FBO,或者绘制垂直翻转纹理的四边形。

关于c - 绘制到 FBO - Sprite 上下颠倒问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12659643/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com