Re: [osg-users] render to a texure bound to an FBO and re-generate mipmaps every frame
Ok, I have solved it. It was my poor understanding of the OpenGL extension mechanism. I discovered the osg way to handle extensions and now I call glGenerateMipmap like this: ... osg::GLExtensions* ext = renderInfo.getState()->get(); ext->glGenerateMipmap(GL_TEXTURE_2D); ... With this, mipmapping in the osgprerender example works! I now will try this in my more contorted development code... On 04/11/2018 10:00 AM, Julius Ziegler wrote: Hello Robert, the first issue that I mentioned, and the sefault of the attempted fix, can be reproduced by slightly adapting the osgprerender.cpp example (attached). I set the texture filtering to something mipmap-ish: ... texture2D->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR_MIPMAP_NEAREST ); texture2D->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); ... When zooming out, one of the lower mipmap layers becomes active and the content of the flag becomes static. As I said, I do not consider this a bug. I know that, on the OpenGL side, an extra call to glGenerateMipmap is required. My first clumsy approach to inject this glGenerateMipmap call was to attach a callback to the flag-drawable: struct CreateMipmapCallback : osg::Drawable::DrawCallback { void drawImplementation( osg::RenderInfo& renderInfo, const osg::Drawable* dwbl ) const override { // these three clears I made to be able to spot // them in a trace of the GL calls glClear( GL_DEPTH_BUFFER_BIT ); glClear( GL_DEPTH_BUFFER_BIT ); glClear( GL_DEPTH_BUFFER_BIT ); // this crashes // glGenerateMipmap(GL_TEXTURE_2D); // just decorate the existing draw function. dwbl->drawImplementation(renderInfo); } }; But glGenerateMipmap segfaults. To be able to call it, I included and linked GLEW. Could that be the problem? I somehow have the impression that I am following an invalid function pointer here. I have attached the modified osgprerender source code. GLEW must be linked to it. I build with this cmdline g++ osgprerender.cpp -o osgprerender `pkg-config --libs --cflags openscenegraph` -std=c++11 -lGLEW -lGL I have tested this with OSG 3.4.0 on Linux 14.04 with an nvidia driver. glxinfo | grep OpenGL shows this: OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce GTX 750 Ti/PCIe/SSE2 OpenGL core profile version string: 4.3.0 NVIDIA 384.111 OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 4.5.0 NVIDIA 384.111 OpenGL shading language version string: 4.50 NVIDIA OpenGL context flags: (none) OpenGL profile mask: (none) OpenGL extensions: This is a "vanilla" build of OpenSceneGraph with no special build settings. My actual target system is more complicated, since for various compatability reasons (Intel driver without proper compatability profile) I had to both build a GL3 version of OSG, and use a recent repository version of it. This might be the reason for the second problem I have, but we can discuss this later. How do I properly call glGenerateMipmap? Thanks! Julius On 04/10/2018 10:06 PM, Robert Osfield wrote: Hi Julius, There isn't much we can do to help at this stage as you don't provide any information about the hadware, OS, driver, OSG version, all we know is that you are using a render to texture technique and there is some issue with mipmapping and some unspecified hardware, OS and OSG version. We don't have your sofftware, data or hardware configuration to test against. It could be a driver bug, it could be a scene graph set up issue, it could be a data problem, it could be an OSG bug, at this stage that's all anyone could say with the information provided. The most productive way for others to help would be if you could provide a small test program that illustrates the problem so that others can run this test on their own systems to see if problem appears, this then should shine more light on the nature of the problem and give us a better chance of getting a solution. Sometimes issues like this turn out to hardware/driver/OS specific so wider testing can show this. If it's a OSG bug then we can then use this a unit test for testing any fixes that will be made. Failing a means to tests things ourselves, the only workaround I an suggest is to not using mipmapping on the texture you are rendering to. Robert. On 10 April 2018 at 20:45, Julius Zieglerwrote: Dear OSG-friends, I currently have a scene graph set up where a pre-render camera renders content to a texture via an FBO, and the main camera uses this texture to texture a quad with it. This works, in principle. However I need mipmapping for that texture, and all but the 0th mipmap level of the texture are empty. With an apitracer, I found out that the glGenerateMipMap call happens 1. only in
Re: [osg-users] render to a texure bound to an FBO and re-generate mipmaps every frame
Hello Robert, the first issue that I mentioned, and the sefault of the attempted fix, can be reproduced by slightly adapting the osgprerender.cpp example (attached). I set the texture filtering to something mipmap-ish: ... texture2D->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR_MIPMAP_NEAREST ); texture2D->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); ... When zooming out, one of the lower mipmap layers becomes active and the content of the flag becomes static. As I said, I do not consider this a bug. I know that, on the OpenGL side, an extra call to glGenerateMipmap is required. My first clumsy approach to inject this glGenerateMipmap call was to attach a callback to the flag-drawable: struct CreateMipmapCallback : osg::Drawable::DrawCallback { void drawImplementation( osg::RenderInfo& renderInfo, const osg::Drawable* dwbl ) const override { // these three clears I made to be able to spot // them in a trace of the GL calls glClear( GL_DEPTH_BUFFER_BIT ); glClear( GL_DEPTH_BUFFER_BIT ); glClear( GL_DEPTH_BUFFER_BIT ); // this crashes // glGenerateMipmap(GL_TEXTURE_2D); // just decorate the existing draw function. dwbl->drawImplementation(renderInfo); } }; But glGenerateMipmap segfaults. To be able to call it, I included and linked GLEW. Could that be the problem? I somehow have the impression that I am following an invalid function pointer here. I have attached the modified osgprerender source code. GLEW must be linked to it. I build with this cmdline g++ osgprerender.cpp -o osgprerender `pkg-config --libs --cflags openscenegraph` -std=c++11 -lGLEW -lGL I have tested this with OSG 3.4.0 on Linux 14.04 with an nvidia driver. glxinfo | grep OpenGL shows this: OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce GTX 750 Ti/PCIe/SSE2 OpenGL core profile version string: 4.3.0 NVIDIA 384.111 OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 4.5.0 NVIDIA 384.111 OpenGL shading language version string: 4.50 NVIDIA OpenGL context flags: (none) OpenGL profile mask: (none) OpenGL extensions: This is a "vanilla" build of OpenSceneGraph with no special build settings. My actual target system is more complicated, since for various compatability reasons (Intel driver without proper compatability profile) I had to both build a GL3 version of OSG, and use a recent repository version of it. This might be the reason for the second problem I have, but we can discuss this later. How do I properly call glGenerateMipmap? Thanks! Julius On 04/10/2018 10:06 PM, Robert Osfield wrote: Hi Julius, There isn't much we can do to help at this stage as you don't provide any information about the hadware, OS, driver, OSG version, all we know is that you are using a render to texture technique and there is some issue with mipmapping and some unspecified hardware, OS and OSG version. We don't have your sofftware, data or hardware configuration to test against. It could be a driver bug, it could be a scene graph set up issue, it could be a data problem, it could be an OSG bug, at this stage that's all anyone could say with the information provided. The most productive way for others to help would be if you could provide a small test program that illustrates the problem so that others can run this test on their own systems to see if problem appears, this then should shine more light on the nature of the problem and give us a better chance of getting a solution. Sometimes issues like this turn out to hardware/driver/OS specific so wider testing can show this. If it's a OSG bug then we can then use this a unit test for testing any fixes that will be made. Failing a means to tests things ourselves, the only workaround I an suggest is to not using mipmapping on the texture you are rendering to. Robert. On 10 April 2018 at 20:45, Julius Zieglerwrote: Dear OSG-friends, I currently have a scene graph set up where a pre-render camera renders content to a texture via an FBO, and the main camera uses this texture to texture a quad with it. This works, in principle. However I need mipmapping for that texture, and all but the 0th mipmap level of the texture are empty. With an apitracer, I found out that the glGenerateMipMap call happens 1. only in the first frame (but I want it to be called every frame). 2. before any draw calls towards the FBO (but I want it after the draw calls). I tried to inject a glGenerateMipMap via a DrawCallback which I attached to the quad, and which just extends the original draw implementation (glGenerateMipMap immediately before the original draw implementation). With the apitracer, I validated that, at the position where I injected the glGenerateMipMap a. the correct
Re: [osg-users] render to a texure bound to an FBO and re-generate mipmaps every frame
Hello Robert, thank you for your reply. I will try to put together a minimal example that people can test. Note that I do not suspect this to be a bug in OSG at all. I assume that points "1" and "2" that I describe are probably the well defined, absolutely normal behaviour that OSG exhibits. I just hope that there is a work around, e.g. by exploiting the callback mechanism. Thanks again, Julius On 04/10/2018 10:06 PM, Robert Osfield wrote: Hi Julius, There isn't much we can do to help at this stage as you don't provide any information about the hadware, OS, driver, OSG version, all we know is that you are using a render to texture technique and there is some issue with mipmapping and some unspecified hardware, OS and OSG version. We don't have your sofftware, data or hardware configuration to test against. It could be a driver bug, it could be a scene graph set up issue, it could be a data problem, it could be an OSG bug, at this stage that's all anyone could say with the information provided. The most productive way for others to help would be if you could provide a small test program that illustrates the problem so that others can run this test on their own systems to see if problem appears, this then should shine more light on the nature of the problem and give us a better chance of getting a solution. Sometimes issues like this turn out to hardware/driver/OS specific so wider testing can show this. If it's a OSG bug then we can then use this a unit test for testing any fixes that will be made. Failing a means to tests things ourselves, the only workaround I an suggest is to not using mipmapping on the texture you are rendering to. Robert. On 10 April 2018 at 20:45, Julius Zieglerwrote: Dear OSG-friends, I currently have a scene graph set up where a pre-render camera renders content to a texture via an FBO, and the main camera uses this texture to texture a quad with it. This works, in principle. However I need mipmapping for that texture, and all but the 0th mipmap level of the texture are empty. With an apitracer, I found out that the glGenerateMipMap call happens 1. only in the first frame (but I want it to be called every frame). 2. before any draw calls towards the FBO (but I want it after the draw calls). I tried to inject a glGenerateMipMap via a DrawCallback which I attached to the quad, and which just extends the original draw implementation (glGenerateMipMap immediately before the original draw implementation). With the apitracer, I validated that, at the position where I injected the glGenerateMipMap a. the correct texture is bound b. the frame buffer is un-bound. But glGenerateMipMap just seg'faults. Because of the seg'fault (I mean we are all used to GL_ERRORS, but seg'faults?) I suspected a driver issue, but I tried it on an alternative platform (one is Intel Graphics, one is Nvidia, both on Linux). Both to the same result. Can you please help? Maybe I overlooked a simple osg-ish way to achieve this (maybe I just have to set something dirty()?) Thanks! Julius ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] render to a texure bound to an FBO and re-generate mipmaps every frame
Hi Julius, There isn't much we can do to help at this stage as you don't provide any information about the hadware, OS, driver, OSG version, all we know is that you are using a render to texture technique and there is some issue with mipmapping and some unspecified hardware, OS and OSG version. We don't have your sofftware, data or hardware configuration to test against. It could be a driver bug, it could be a scene graph set up issue, it could be a data problem, it could be an OSG bug, at this stage that's all anyone could say with the information provided. The most productive way for others to help would be if you could provide a small test program that illustrates the problem so that others can run this test on their own systems to see if problem appears, this then should shine more light on the nature of the problem and give us a better chance of getting a solution. Sometimes issues like this turn out to hardware/driver/OS specific so wider testing can show this. If it's a OSG bug then we can then use this a unit test for testing any fixes that will be made. Failing a means to tests things ourselves, the only workaround I an suggest is to not using mipmapping on the texture you are rendering to. Robert. On 10 April 2018 at 20:45, Julius Zieglerwrote: > Dear OSG-friends, > > I currently have a scene graph set up where a pre-render camera renders > content to a texture via an FBO, and the main camera uses this texture to > texture a quad with it. This works, in principle. > > However I need mipmapping for that texture, and all but the 0th mipmap level > of the texture are empty. > > With an apitracer, I found out that the glGenerateMipMap call happens > > 1. only in the first frame (but I want it to be called every frame). > 2. before any draw calls towards the FBO (but I want it after the draw > calls). > > I tried to inject a glGenerateMipMap via a DrawCallback which I attached to > the quad, and which just extends the original draw implementation > (glGenerateMipMap immediately before the original draw implementation). > > With the apitracer, I validated that, at the position where I injected the > glGenerateMipMap > > a. the correct texture is bound > b. the frame buffer is un-bound. > > But glGenerateMipMap just seg'faults. Because of the seg'fault (I mean we > are all used to GL_ERRORS, but seg'faults?) I suspected a driver issue, but > I tried it on an alternative platform (one is Intel Graphics, one is Nvidia, > both on Linux). Both to the same result. > > Can you please help? Maybe I overlooked a simple osg-ish way to achieve this > (maybe I just have to set something dirty()?) > > Thanks! > > Julius > ___ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org