void FrameBufferAttachment::createRequiredTexturesAndApplyGenerateMipMap(State &state, const GLExtensions* ext) const { unsigned int contextID = state.getContextID(); // force compile texture if necessary Texture::TextureObject *tobj = 0; if (_ximpl->textureTarget.valid()) { tobj = _ximpl->textureTarget->getTextureObject(contextID); if (!tobj || tobj->id() == 0) { _ximpl->textureTarget->compileGLObjects(state); tobj = _ximpl->textureTarget->getTextureObject(contextID); } if (!tobj || tobj->id() == 0) return; Texture::FilterMode minFilter = _ximpl->textureTarget->getFilter(Texture::MIN_FILTER); if (minFilter==Texture::LINEAR_MIPMAP_LINEAR || minFilter==Texture::LINEAR_MIPMAP_NEAREST || minFilter==Texture::NEAREST_MIPMAP_LINEAR || minFilter==Texture::NEAREST_MIPMAP_NEAREST) { state.setActiveTextureUnit(0); state.applyTextureAttribute(0, _ximpl->textureTarget.get()); ext->glGenerateMipmap(_ximpl->textureTarget->getTextureTarget()); } } }
void FrameBufferAttachment::attach(State &state, GLenum target, GLenum attachment_point, const FBOExtensions* ext) const { unsigned int contextID = state.getContextID(); Texture::TextureObject *tobj = 0; if (_ximpl->textureTarget.valid()) { tobj = _ximpl->textureTarget->getTextureObject(contextID); if (!tobj || tobj->id() == 0) { _ximpl->textureTarget->compileGLObjects(state); tobj = _ximpl->textureTarget->getTextureObject(contextID); } if (!tobj || tobj->id() == 0) return; } switch (_ximpl->targetType) { default: case Pimpl::RENDERBUFFER: ext->glFramebufferRenderbuffer(target, attachment_point, GL_RENDERBUFFER_EXT, _ximpl->renderbufferTarget->getObjectID(contextID, ext)); break; case Pimpl::TEXTURE1D: ext->glFramebufferTexture1D(target, attachment_point, GL_TEXTURE_1D, tobj->id(), _ximpl->level); break; case Pimpl::TEXTURE2D: ext->glFramebufferTexture2D(target, attachment_point, GL_TEXTURE_2D, tobj->id(), _ximpl->level); break; case Pimpl::TEXTURE3D: ext->glFramebufferTexture3D(target, attachment_point, GL_TEXTURE_3D, tobj->id(), _ximpl->level, _ximpl->zoffset); break; case Pimpl::TEXTURE2DARRAY: ext->glFramebufferTextureLayer(target, attachment_point, tobj->id(), _ximpl->level, _ximpl->zoffset); break; case Pimpl::TEXTURERECT: ext->glFramebufferTexture2D(target, attachment_point, GL_TEXTURE_RECTANGLE, tobj->id(), 0); break; case Pimpl::TEXTURECUBE: ext->glFramebufferTexture2D(target, attachment_point, GL_TEXTURE_CUBE_MAP_POSITIVE_X + _ximpl->cubeMapFace, tobj->id(), _ximpl->level); break; } }