// Inheritance exigences void TGBufferCanvas::Init() { // Drawable data m_output.width = m_width; m_output.height = m_height; // Creating the main frame buffer m_frameBuffer = CreateFrameBuffer(); BindFrameBuffer(m_frameBuffer); // Creating the textures // Memory allocation m_output.buffers.resize(5); // The abledo buffer TTextureInfo& albedo = m_output.buffers[0]; albedo.name = "albedo"; albedo.type = TTextureNature::COLOR; albedo.offset = 0; CreateTexture(albedo, m_width, m_height); BindToFrameBuffer(albedo); // The normal buffer TTextureInfo& normal = m_output.buffers[1]; normal.name = "normal"; normal.type = TTextureNature::COLOR; normal.offset = 1; CreateTexture(normal, m_width, m_height); BindToFrameBuffer(normal); // The specular buffer TTextureInfo& specular = m_output.buffers[2]; specular.name = "specular"; specular.type = TTextureNature::COLOR; specular.offset = 2; CreateTexture(specular, m_width, m_height); BindToFrameBuffer(specular); // Position Buffer TTextureInfo& position = m_output.buffers[3]; position.name = "position"; position.type = TTextureNature::COLOR; position.offset = 3; CreateTexture(position, m_width, m_height); BindToFrameBuffer(position); // Depth buffer TTextureInfo& depth = m_output.buffers[4]; depth.name = "depth"; depth.type = TTextureNature::DEPTH; depth.offset = 4; CreateTexture(depth, m_width, m_height); BindToFrameBuffer(depth); // Making sure everything is OK CheckFrameBuffer(); UnBindFrameBuffer(); }
void FGLRenderer::BindToFrameBuffer(FMaterial *mat) { auto BaseLayer = static_cast<FHardwareTexture*>(mat->GetLayer(0, 0)); if (BaseLayer == nullptr) { // must create the hardware texture first BaseLayer->BindOrCreate(mat->sourcetex, 0, 0, 0, 0); FHardwareTexture::Unbind(0); gl_RenderState.ClearLastMaterial(); } BaseLayer->BindToFrameBuffer(mat->GetWidth(), mat->GetHeight()); }
void FGLRenderer::RenderTextureView(FCanvasTexture *tex, AActor *Viewpoint, double FOV) { // This doesn't need to clear the fake flat cache. It can be shared between camera textures and the main view of a scene. FMaterial * gltex = FMaterial::ValidateTexture(tex, false); int width = gltex->TextureWidth(); int height = gltex->TextureHeight(); StartOffscreen(); BindToFrameBuffer(gltex); IntRect bounds; bounds.left = bounds.top = 0; bounds.width = FHardwareTexture::GetTexDimension(gltex->GetWidth()); bounds.height = FHardwareTexture::GetTexDimension(gltex->GetHeight()); FRenderViewpoint texvp; RenderViewpoint(texvp, Viewpoint, &bounds, FOV, (float)width / height, (float)width / height, false, false); EndOffscreen(); tex->SetUpdated(true); static_cast<OpenGLFrameBuffer*>(screen)->camtexcount++; }