2012-09-30 10 views
9

Cóż, korzystanie z FBO jest szerokie i pomaga znacznie ułatwić złożone efekty. Ustawiam FBO i narysuję do niego, a następnie wyrenderuję quiz FBO, bez problemu, nawet testowanie kolorowego shadera do przetwarzania ekranu. Ale wszystko, co przekazuję FBO, stało się z jakiegoś powodu do góry nogami. Jeśli wyświetlę na ekranie FBO wszystko jest normalne, a nawet nie wykonuję żadnych obrotów, aby spryskać.Rysowanie do FBO - odwrócone sprite w górę iw dół wydanie

FBO tworzenie

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 Wykorzystanie

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

Wynik: with FBO Wynik z szarości shadera: with grayscale shader

Render bez 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

+8

Zobacz: http://www.java-gaming.org/index.php?topic=24126.0 Szczególnie ta część: "Początki tekstur i początki okien są lewym dolnym rogiem w OpenGL. Może to być problem? :) – Jite

+0

My bad). Tak prosty sposób to po prostu obracać duszek do 180.0f na osi Z? – Aristarhys

+2

nie, musisz odwrócić współrzędne y podczas rysowania fbo. Nie obracaj o 180 °, ponieważ może to również odzwierciedlać Twój obraz. – kritzikratzi

Odpowiedz

4

Zagregowane z uwagami:

Dzieje się tak dlatego, że OpenGL ma początek w lewym dolnym rogu, w przeciwieństwie do większości systemów okienkowych w użyj, gdzie pochodzenie znajduje się w lewym górnym rogu.

Po prostu upewnij się, że współrzędne tekstury wynoszą od 0,1 w lewym górnym rogu do 1,0 w prawym dolnym rogu, aby prawidłowo wyciągnąć FBO, lub narysuj kwadrat z teksturą przewróconą w pionie.

Powiązane problemy