[osg-users] render to a texure bound to an FBO and re-generate mipmaps every frame
Julius Ziegler
ziegler at atlatec.de
Wed Apr 11 01:00:13 PDT 2018
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 Ziegler <ziegler at atlatec.de> wrote:
>> 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 at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
--
Dr.-Ing. Julius Ziegler
Phone: +49 151 722 026 63
E-Mail: ziegler at atlatec.de
Web: www.atlatec.de
Atlatec GmbH
Haid- und Neu-Strasse 7
D-76131 Karlsruhe
Sitz der Gesellschaft: Karlsruhe | Registergericht Mannheim
Handelsregisternummer: HRB 718673 | USt-IdNr. DE293003755
Geschäftsführer: Dr. Henning Lategahn
-------------- next part --------------
A non-text attachment was scrubbed...
Name: osgprerender-modified.cpp
Type: text/x-c++src
Size: 18918 bytes
Desc: not available
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20180411/b45c035c/attachment.cpp>
More information about the osg-users
mailing list