GLboolean fbo_create(fbo *F, GLsizei w, GLsizei h) { if (gli.framebuffer_object == 0) return GL_FALSE; F->width = w; F->height = h; glGenTextures (1, &F->color_texture); glGenTextures (1, &F->depth_texture); glGenFramebuffers_(1, &F->framebuffer); glBindTexture (GL_TEXTURE_2D, F->color_texture); 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_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_INT, NULL); glBindTexture (GL_TEXTURE_2D, F->depth_texture); 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_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); glBindFramebuffer_ (GL_FRAMEBUFFER, F->framebuffer); glFramebufferTexture2D_(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, F->color_texture, 0); glFramebufferTexture2D_(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, F->depth_texture, 0); glFramebufferTexture2D_(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, F->depth_texture, 0); if (glCheckFramebufferStatus_(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { glBindFramebuffer_(GL_FRAMEBUFFER, 0); return GL_TRUE; } else { glBindFramebuffer_(GL_FRAMEBUFFER, 0); return GL_FALSE; } }
int Lua_Framebuffer_new(lua_State *L) { Lua_Image *ptr; unsigned int width, height, percision, alpha; GLint current_fbo; GLenum internal, format; if(!supported.FBO) return 0; width = luaL_checkinteger(L, 1); height = luaL_checkinteger(L, 2); percision = lua_tointeger(L, 3); alpha = lua_toboolean(L, 4); if(percision == 32) { internal = alpha ? GL_RGBA32F_ARB : GL_RGB32F_ARB; format = GL_FLOAT; } else if(percision == 16) { internal = alpha ? GL_RGBA16F_ARB : GL_RGB16F_ARB; format = GL_FLOAT; } else { internal = alpha ? GL_RGBA : GL_RGB; format = GL_UNSIGNED_BYTE; } //save current fbo glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, ¤t_fbo); ptr = lua_newuserdata(L, sizeof(Lua_Image)); ptr->w = width; ptr->h = height; // generate texture save target glGenTextures(1, &ptr->texture); glBindTexture(GL_TEXTURE_2D, ptr->texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //~ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); //~ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D(GL_TEXTURE_2D,0,internal,width,height,0,GL_RGBA,format,0); glBindTexture(GL_TEXTURE_2D, 0); // create framebuffer glGenFramebuffers_(1, &ptr->fbo); glBindFramebuffer_(GL_FRAMEBUFFER_EXT, ptr->fbo); glFramebufferTexture2D_(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, ptr->texture, 0); checkFramebufferStatus(); // unbind framebuffer glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, (GLuint)current_fbo); luaL_getmetatable(L, "scrupp.image"); lua_setmetatable(L, -2); return 1; }