Opened 7 years ago
Closed 7 years ago
#1466 closed defect (fixed)
Can't save offscreen image
| Reported by: | Greg Couch | Owned by: | Tom Goddard |
|---|---|---|---|
| Priority: | blocker | Milestone: | 0.8 |
| Component: | Graphics | Version: | |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: | 1427 | |
| Notify when closed: | Platform: | all | |
| Project: | ChimeraX |
Description
After fixing many offscreen bugs, saving an image now fails with:
Traceback (most recent call last):
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/nogui.py", line 211, in execute
self._cmd.run(text)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/commands/cli.py", line 2581, in run
result = ci.function(session, **kw_args)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/commands/save.py", line 61, in save
fmt.export(session, filename, fmt.nicknames[0], **kw)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/io.py", line 198, in export
result = self.export_func(session, path, **kw)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/image.py", line 149, in save_image
transparent_background=transparent_background)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/view.py", line 378, in image
if not fb.activate():
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/opengl.py", line 1817, in activate
fbo = self.framebuffer_id
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/opengl.py", line 1813, in framebuffer_id
self._fbo = fbo = self._create_framebuffer()
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/opengl.py", line 1694, in _create_framebuffer
self.depth_texture or self._depth_rb)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/opengl.py", line 1699, in _create_fbo
self._opengl_context._framebuffers.add(self)
AttributeError: 'OffScreenRenderingContext' object has no attribute '_framebuffers'
And after naively adding _framebuffers and _bindings to OffScreenRenderingContext (not checked in):
Traceback (most recent call last):
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/nogui.py", line 211, in execute
self._cmd.run(text)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/commands/cli.py", line 2581, in run
result = ci.function(session, **kw_args)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/commands/save.py", line 61, in save
fmt.export(session, filename, fmt.nicknames[0], **kw)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/io.py", line 198, in export
result = self.export_func(session, path, **kw)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/image.py", line 149, in save_image
transparent_background=transparent_background)
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/view.py", line 414, in image
r.pop_framebuffer()
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/opengl.py", line 561, in pop_framebuffer
fb.activate()
File "..../ChimeraX.app/lib/python3.6/site-packages/chimerax/core/graphics/opengl.py", line 1821, in activate
GL.glDrawBuffer(self._draw_buffer)
File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src/errorchecker.c:1218)
OpenGL.error.GLError: GLError(
err = 1282,
description = b'invalid operation',
baseOperation = glDrawBuffer,
cArguments = (GL_BACK,)
)
Change History (5)
comment:1 by , 7 years ago
comment:2 by , 7 years ago
| Blocking: | → 1427 |
|---|
comment:3 by , 7 years ago
The OffScreenRenderingContext will need to have _framebuffers and _bindings attributes (WeakSets) and all the other features of OpenGLContext in order to render. The underscore in these methods is intended to mean they are private within this file (not that the are private within the class) -- Framebuffer and Bindings directly use those attributes and are part of the opengl context management as are several other classes.
comment:4 by , 7 years ago
The invalid operation error in glDrawBuffer(GL_BACK) is because the Framebuffer constructor assumes that the default framebuffer (id 0) is an on-screen buffer and double buffered so it uses GL_BACK as its draw target. For offscreen rendering the default framebuffer probably needs a draw target like GL_COLOR_ATTACHMENT0. The Render.default_framebuffer() method will need to handle this case.
I'm not going to make changes to this code that I can't test -- I don't have a linux development machine to work on right now. So it will have to wait until I have a machine to test changes on.
comment:5 by , 7 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Fixed.
The draw target for OSMesa needed to be GL_FRONT instead of GL_BACK since the default framebuffer is single-buffered.
To reproduce, use a ChimeraX Linux daily build from 2018-11-20 or newer. Open some data and then "save image foo.png".