Further work on trying to get glGenerateMipMapEXT working in conjunction with
frame buffer objects. Still don't work under Linux yet through :-|
This commit is contained in:
@@ -272,7 +272,7 @@ FrameBufferAttachment &FrameBufferAttachment::operator = (const FrameBufferAttac
|
||||
return *this;
|
||||
}
|
||||
|
||||
void FrameBufferAttachment::attach(State &state, GLenum attachment_point, const FBOExtensions* ext) const
|
||||
void FrameBufferAttachment::createRequiredTexturesAndApplyGenerateMipMap(State &state, const FBOExtensions* ext) const
|
||||
{
|
||||
unsigned int contextID = state.getContextID();
|
||||
|
||||
@@ -285,11 +285,41 @@ void FrameBufferAttachment::attach(State &state, GLenum attachment_point, const
|
||||
{
|
||||
_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)
|
||||
{
|
||||
ext->glGenerateMipmapEXT(_ximpl->textureTarget->getTextureTarget());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void FrameBufferAttachment::attach(State &state, 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:
|
||||
@@ -379,9 +409,22 @@ void FrameBufferObject::apply(State &state) const
|
||||
notify(WARN) << "Warning: FrameBufferObject: could not create the FBO" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
dirtyAttachmentList = 1;
|
||||
|
||||
}
|
||||
|
||||
if (dirtyAttachmentList)
|
||||
{
|
||||
// create textures and mipmaps before we bind the frame buffer object
|
||||
for (AttachmentMap::const_iterator i=_attachments.begin(); i!=_attachments.end(); ++i)
|
||||
{
|
||||
const FrameBufferAttachment &fa = i->second;
|
||||
fa.createRequiredTexturesAndApplyGenerateMipMap(state, ext);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ext->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID);
|
||||
|
||||
if (dirtyAttachmentList)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <osg/Texture3D>
|
||||
#include <osg/TextureRectangle>
|
||||
#include <osg/TextureCubeMap>
|
||||
#include <osg/Notify>
|
||||
|
||||
using namespace osg;
|
||||
using namespace osgUtil;
|
||||
@@ -43,35 +44,12 @@ void RenderToTextureStage::reset()
|
||||
RenderStage::reset();
|
||||
}
|
||||
|
||||
class GenerateMipMapHelper : public StateAttribute::ModeUsage
|
||||
{
|
||||
public:
|
||||
GenerateMipMapHelper(osg::FBOExtensions* fbo_ext):
|
||||
_fbo_ext(fbo_ext) {}
|
||||
|
||||
virtual ~GenerateMipMapHelper() {}
|
||||
|
||||
virtual void usesMode(StateAttribute::GLMode)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void usesTextureMode(StateAttribute::GLMode mode)
|
||||
{
|
||||
_fbo_ext->glGenerateMipmapEXT((GLenum)mode);
|
||||
}
|
||||
|
||||
osg::FBOExtensions* _fbo_ext;
|
||||
|
||||
};
|
||||
|
||||
|
||||
void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
|
||||
{
|
||||
|
||||
if (_stageDrawnThisFrame) return;
|
||||
|
||||
state.checkGLErrors("beginning of RenderToTextureStage::draw()");
|
||||
|
||||
//cout << "begining RTTS draw "<<this<< " "<<_viewport->x()<<","<< _viewport->y()<<","<< _viewport->width()<<","<< _viewport->height()<<std::endl;
|
||||
|
||||
osg::State* useState = &state;
|
||||
@@ -148,22 +126,6 @@ void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
|
||||
_image->readPixels(_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height(),_imageReadPixelFormat,_imageReadPixelDataType);
|
||||
}
|
||||
|
||||
if (fbo_supported && _camera)
|
||||
{
|
||||
// now generate mipmaps if they are required.
|
||||
const osg::CameraNode::BufferAttachmentMap& bufferAttachements = _camera->getBufferAttachmentMap();
|
||||
for(osg::CameraNode::BufferAttachmentMap::const_iterator itr = bufferAttachements.begin();
|
||||
itr != bufferAttachements.end();
|
||||
++itr)
|
||||
{
|
||||
if (itr->second._texture.valid() && itr->second._mipMapGeneration)
|
||||
{
|
||||
itr->second._texture->apply(*useState);
|
||||
GenerateMipMapHelper generateMipMap(fbo_ext);
|
||||
itr->second._texture->getModeUsage(generateMipMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_camera && _camera->getPostDrawCallback())
|
||||
{
|
||||
@@ -176,6 +138,22 @@ void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
|
||||
// switch of the frame buffer object
|
||||
fbo_ext->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
}
|
||||
|
||||
if (fbo_supported && _camera)
|
||||
{
|
||||
// now generate mipmaps if they are required.
|
||||
const osg::CameraNode::BufferAttachmentMap& bufferAttachements = _camera->getBufferAttachmentMap();
|
||||
for(osg::CameraNode::BufferAttachmentMap::const_iterator itr = bufferAttachements.begin();
|
||||
itr != bufferAttachements.end();
|
||||
++itr)
|
||||
{
|
||||
if (itr->second._texture.valid() && itr->second._mipMapGeneration)
|
||||
{
|
||||
itr->second._texture->apply(*useState);
|
||||
// fbo_ext->glGenerateMipmapEXT(itr->second._texture->getTextureTarget());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (callingContext && useContext != callingContext)
|
||||
{
|
||||
@@ -184,8 +162,5 @@ void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
|
||||
|
||||
glReadBuffer(GL_BACK);
|
||||
}
|
||||
|
||||
state.checkGLErrors("end of RenderToTextureStage::draw()");
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user