ठीक है, एफबीओ का उपयोग व्यापक है और यह जटिल प्रभाव को अधिक आसान बनाने में मदद करता है। मैंने एफबीओ सेट किया है और इसे आकर्षित किया है, फिर बिना किसी समस्या के एफबीओ बनावट क्वाड प्रस्तुत करें, यहां तक कि सरल स्क्रीन प्रसंस्करण रंग शेडर का परीक्षण भी करें। लेकिन कुछ कारणों से मैं एफबीओ को जो कुछ भी प्रस्तुत करता हूं वह उल्टा हो गया। अगर मैं स्टॉक स्क्रीन पर प्रस्तुत करता हूं तो एफबीओ सब कुछ सामान्य है, और मैं स्प्राइट करने के लिए भी कोई रोटेशन नहीं करता हूं।एफबीओ को आकर्षित करना - उलटा हुआ ऊपर और नीचे अंक
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));
}
परिणाम: : ग्रेस्केल शेडर साथ परिणाम
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));
}
इसे देखें: http://www.java-gaming.org/index.php?topic=24126.0 विशेष रूप से यह हिस्सा: 'बनावट उत्पत्ति और खिड़की की उत्पत्ति ओपनजीएल में निचला बाएं कोने है।' क्या समस्या हो सकती है? :) – Jite
मेरा बुरा)। इतना सरल तरीका सिर्फ z-axis पर 180.0f तक स्प्राइट घुमाएगा? – Aristarhys
नहीं, आपको एफबीओ ड्राइंग करते समय वाई निर्देशांक फ़्लिप करना होगा। 180 डिग्री से घूमते नहीं क्योंकि यह आपकी छवि को भी दर्पण करेगा। – kritzikratzi