I’m a programmer and I’m writing an application to furnish stands of exhibitions. I use Delphi 5 and GlScene components.
My software allows to take some objects from a list and move those in a scene viewer. It also allow to can create an image of the work: I have another scene viewer with fixed size 1024x768 in a separate window, that remains hidden. When I need to create the snapshot I connect the camera of the work’s viewer to the second viewer, I call the render procedure, and I save the snapshot. It works in some PC, but in a PC with Geforce 7300 graphic card the snapshot is completely black. If I make the second window visible, during the saving of image, the screenshot contain the scene correctly.
I suppose that the driver don’t render the hidden parts of a scene, but it’s a problem for me.
Any idea to how disable this particularity?
Thank you, sorry for my english.
Non-visible pixels are undefined for the classic opengl rendering buffer, this is written in the opengl spec.
Instead, use a real offscreen buffer such as FBO (framebuffer object).
Ok, thank you for the suggestion.
Now I use a class called tGlMemoryViewer, where I can render my scene into memory and then make a snapshot.
Unfortunately there’s another problem: in some PC my program raises an exception that tells me “wgl_arb_pbuffer support needed”.
I think that this “pbuffer” is a particularity of some video cards. How can I know where it is present? Is there another way to render in memory without using “pbuffer”? Can you tell me something?
Thank you very much
While it is up to the driver to implement it, I think that most drivers support it. The most likely reason for its absence is, that the PC in question does not have OGL capable drivers installed.
How can I know where it is present?
The GLScene provides WGL_ARB_pbuffer and WGL_ARB_pixel_format variables which indicate if required extensions are supported. The more safe way is to catch the exceptions raised by the tGlMemoryViewer when it can not be constructed and use that as indication that this component is not supported.
Is there another way to render in memory without using “pbuffer”? Can you tell me something?
There is newer extension called EXT_framebuffer_object (FBO) which provides that capability. It is however probably not directly supported by the GLScene.