2012-09-30 11 views
9

ठीक है, एफबीओ का उपयोग व्यापक है और यह जटिल प्रभाव को अधिक आसान बनाने में मदद करता है। मैंने एफबीओ सेट किया है और इसे आकर्षित किया है, फिर बिना किसी समस्या के एफबीओ बनावट क्वाड प्रस्तुत करें, यहां तक ​​कि सरल स्क्रीन प्रसंस्करण रंग शेडर का परीक्षण भी करें। लेकिन कुछ कारणों से मैं एफबीओ को जो कुछ भी प्रस्तुत करता हूं वह उल्टा हो गया। अगर मैं स्टॉक स्क्रीन पर प्रस्तुत करता हूं तो एफबीओ सब कुछ सामान्य है, और मैं स्प्राइट करने के लिए भी कोई रोटेशन नहीं करता हूं।एफबीओ को आकर्षित करना - उलटा हुआ ऊपर और नीचे अंक

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 ग्रेस्केल शेडर साथ परिणाम

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

इसे देखें: http://www.java-gaming.org/index.php?topic=24126.0 विशेष रूप से यह हिस्सा: 'बनावट उत्पत्ति और खिड़की की उत्पत्ति ओपनजीएल में निचला बाएं कोने है।' क्या समस्या हो सकती है? :) – Jite

+0

मेरा बुरा)। इतना सरल तरीका सिर्फ z-axis पर 180.0f तक स्प्राइट घुमाएगा? – Aristarhys

+2

नहीं, आपको एफबीओ ड्राइंग करते समय वाई निर्देशांक फ़्लिप करना होगा। 180 डिग्री से घूमते नहीं क्योंकि यह आपकी छवि को भी दर्पण करेगा। – kritzikratzi

उत्तर

4

टिप्पणियों से एकत्रित:

यह इसलिए होता है क्योंकि ओपन, निचले बाएँ कोने में मूल है में सबसे विंडोइंग प्रणाली के विपरीत उपयोग करें, जहां उत्पत्ति ऊपरी बाएं कोने में है।

बस यह सुनिश्चित करें कि बनावट निर्देशांक एफबीओ को सही ढंग से आकर्षित करने के लिए ऊपरी बाएं में 0,1 से दाएं दाएं ओर 1,0 से चला जाता है, या बनावट के साथ चौकोर को लंबवत रूप से फ़्लिप किया जाता है।

संबंधित मुद्दे