An OpenGL 3.0+ renderer, based on PyOpenGL.
| 28 | C_VOID_PS.append(ctypes.c_void_p(4*4*i)) |
| 29 | |
| 30 | class OpenGLRenderer(object): |
| 31 | """An OpenGL 3.0+ renderer, based on PyOpenGL. |
| 32 | """ |
| 33 | |
| 34 | def __init__(self, scene): |
| 35 | """Initialize a renderer for a given scene. |
| 36 | |
| 37 | Parameters |
| 38 | ---------- |
| 39 | scene : Scene |
| 40 | A scene description. |
| 41 | """ |
| 42 | self.scene = scene |
| 43 | self._width = self.scene.camera.intrinsics.width |
| 44 | self._height = self.scene.camera.intrinsics.height |
| 45 | self._vaids = None |
| 46 | self._colorbuf, self._depthbuf = None, None |
| 47 | self._framebuf = None |
| 48 | |
| 49 | # Initialize the OpenGL context |
| 50 | self._init_gl_context() |
| 51 | |
| 52 | # Bind the frame buffer for offscreen rendering |
| 53 | self._bind_frame_buffer() |
| 54 | |
| 55 | # Use the depth test functionality of OpenGL. Don't clip -- many normals may be backwards. |
| 56 | glEnable(GL_DEPTH_TEST) |
| 57 | glDepthMask(GL_TRUE) |
| 58 | glDepthFunc(GL_LESS) |
| 59 | glDepthRange(0.0, 1.0) |
| 60 | |
| 61 | # Load the meshes into VAO's |
| 62 | self._buffers = None |
| 63 | self._vaids = self._load_meshes() |
| 64 | |
| 65 | # Load the shaders |
| 66 | # Fix for pyopengl -- bind a framebuffer |
| 67 | glBindVertexArray(self._vaids[0]) |
| 68 | self._full_shader = self._load_shaders(vertex_shader, fragment_shader) |
| 69 | self._depth_shader = self._load_shaders(depth_vertex_shader, depth_fragment_shader) |
| 70 | glBindVertexArray(0) |
| 71 | |
| 72 | |
| 73 | def _init_gl_context(self): |
| 74 | if _USE_EGL_OFFSCREEN: |
| 75 | self._init_egl() |
| 76 | else: |
| 77 | self._init_pyglet() |
| 78 | |
| 79 | |
| 80 | def _make_gl_context_current(self): |
| 81 | if not _USE_EGL_OFFSCREEN: |
| 82 | if self._window: |
| 83 | self._window.switch_to() |
| 84 | |
| 85 | |
| 86 | def _init_pyglet(self): |
| 87 | import pyglet |