def main(): glfw.setErrorCallback(error_callback) glfw.init() glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) # glfw.windowHint(glfw.RESIZABLE, gl.FALSE) glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, 1) window = glfw.createWindow(800, 600, "LearnOpenGL") if window is None: print('could not open window.') glfw.terminate() sys.exit() window.makeContextCurrent() window.setKeyCallback(key_callback) gl.init() gl.clearColor(0.2, 0.3, 0.3, 1.0) while not window.shouldClose(): framebuffer_width, framebuffer_height = window.getFramebufferSize() gl.viewport(0, 0, framebuffer_width, framebuffer_height) gl.clear(gl.COLOR_BUFFER_BIT) glfw.pollEvents() window.swapBuffers()
def step(self): window = self.get_node('/window') scene = self.get_node('/window/scene') sprite_renderer = self.get_node('/window/scene/sprite_renderer') debugdraw_renderer = self.get_node('/window/scene/debugdraw_renderer') if window.should_close(): sys.exit() # trigger the callbacks glfw.pollEvents() window.make_context_current() framebuffer_width, framebuffer_height = window.get_framebuffer_size() gl.viewport(0, 0, framebuffer_width, framebuffer_height) gl.clearColor(0.2, 0.3, 0.3, 1.0) gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT) gl.enable(gl.BLEND) gl.enable(gl.DEPTH_TEST) # sprite_renderer.draw() gl.disable(gl.BLEND) gl.disable(gl.DEPTH_TEST) scene.emit('predraw') debugdraw_renderer.draw() # draw the debug draw scene on top of the other stuff. scene.emit('postdraw') scene.step() #print(scene.get_node('transform').position, scene.get_node('transform').angle) window.swap_buffers()
def render_to_viewport(self, viewport): x, y, fb_w, fb_h = viewport gl.viewport(x, y, fb_w, fb_h) if self.clear: gl.clearColor(*self.clear_color) gl.clear(self.clear) self.scene.draw(viewport, self)
def main(): glfw.setErrorCallback(error_callback) glfw.init() glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) # glfw.windowHint(glfw.RESIZABLE, gl.FALSE) glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, 1) window = glfw.createWindow(800, 600, "LearnOpenGL") if window is None: print('could not open window.') glfw.terminate() sys.exit() window.makeContextCurrent() window.setKeyCallback(key_callback) gl.init() err = gl.getError() print(gl) if err: print("WINDOW OPEN ERROR:", err) vertexShader = gl.createShader(gl.VERTEX_SHADER) gl.shaderSource(vertexShader, [VERTEX_SHADER_SOURCE]); gl.compileShader(vertexShader) success = gl.getShaderiv(vertexShader, gl.COMPILE_STATUS) print("VERTEX SHADER COMPILE STATUS:",success) if not success: infoLog = gl.getShaderInfoLog(vertexShader) print("ERROR COMPILING SHADER:", infoLog) sys.exit() fragmentShader = gl.createShader(gl.FRAGMENT_SHADER) gl.shaderSource(fragmentShader, [FRAGMENT_SHADER_SOURCE]); gl.compileShader(fragmentShader) success = gl.getShaderiv(fragmentShader, gl.COMPILE_STATUS) print("FRAGMENT SHADER COMPILE STATUS:",success) if not success: infoLog = gl.getShaderInfoLog(fragmentShader) print("ERROR COMPILING SHADER:", infoLog) sys.exit() shaderProgram = gl.createProgram() gl.attachShader(shaderProgram, vertexShader) gl.attachShader(shaderProgram, fragmentShader) gl.linkProgram(shaderProgram) gl.getProgramiv(shaderProgram, gl.LINK_STATUS) print("SHADER PROGRAM LINK STATUS:",success) if not success: infoLog = gl.getProgramInfoLog(shaderProgram) print("ERROR LINKING SHADER PROGRAM:", infoLog) sys.exit() assert(gl.isProgram(shaderProgram)) gl.useProgram(shaderProgram) #gl.deleteShader(vertexShader) #gl.deleteShader(fragmentShader) vao = gl.genVertexArrays(1)[0] vbo, ebo = gl.genBuffers(2) print(vao, vbo, ebo) # 1. Bind Vertex Array Object gl.bindVertexArray(vao) # 2. Copy our vertices array in a buffer for OpenGL to use gl.bindBuffer(gl.ARRAY_BUFFER, vbo) gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW) # 2. Copy our index array in a buffer for OpenGL to use gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo) gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW) # 3. Then set our vertex attributes pointers gl.vertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 3 * sizeof(gl.GLfloat), None) gl.enableVertexAttribArray(0) # 4. unbind the vbo gl.bindBuffer(gl.ARRAY_BUFFER, 0) # 4. Unbind the VAO gl.bindVertexArray(0) while not window.shouldClose(): glfw.pollEvents() framebuffer_width, framebuffer_height = window.getFramebufferSize() gl.viewport(0, 0, framebuffer_width, framebuffer_height) gl.clearColor(0.2, 0.3, 0.3, 1.0) gl.clear(gl.COLOR_BUFFER_BIT) gl.useProgram(shaderProgram) gl.bindVertexArray(vao) gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, 0) # gl.drawArrays(gl.TRIANGLES, 0, 3); gl.bindVertexArray(0) window.swapBuffers() gl.deleteVertexArrays([vao]) gl.deleteBuffers([vbo, ebo])
def main(): glfw.setErrorCallback(error_callback) glfw.init() glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) # glfw.windowHint(glfw.RESIZABLE, gl.FALSE) glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, 1) window = glfw.createWindow(WIDTH, HEIGHT, "LearnOpenGL") if window is None: print('could not open window.') glfw.terminate() sys.exit() inputMap = InputMap() window.makeContextCurrent() window.setKeyCallback(inputMap.key_callback) window.setCursorPosCallback(inputMap.mouse_callback) #window.setScrollCallback(inputMap.scroll_callback) window.setInputMode(glfw.CURSOR, glfw.CURSOR_DISABLED) gl.init() err = gl.getError() if err: print("WINDOW OPEN ERROR:", err) camera = Camera(position=Vec3(0.0, 0.0, 3.0)) lastX = 400 lastY = 300 firstMouse = True deltaTime = 0.0 lastFrame = 0.0 gl.enable(gl.DEPTH_TEST) lampShaderProgram = Shader(LAMP_VERTEX_SHADER_SOURCE, LAMP_FRAGMENT_SHADER_SOURCE) lightingShaderProgram = Shader(LIGHTING_VERTEX_SHADER_SOURCE, LIGHTING_FRAGMENT_SHADER_SOURCE) lightingShaderProgram.use() lightVAO, containerVAO = gl.genVertexArrays(2) vbo = gl.genBuffers(1)[0] # 1. Bind Vertex Array Object gl.bindVertexArray(containerVAO) # 2. Copy our vertices array in a buffer for OpenGL to use gl.bindBuffer(gl.ARRAY_BUFFER, vbo) gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW) # Position attribute gl.vertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, sizeof(Vertex), Vertex.position.offset) gl.enableVertexAttribArray(0) # Normal attribute gl.vertexAttribPointer(1, 3, gl.FLOAT, gl.FALSE, sizeof(Vertex), Vertex.normal.offset) gl.enableVertexAttribArray(1) # 4. Unbind the VAO gl.bindVertexArray(0) # 1. Bind Vertex Array Object gl.bindVertexArray(lightVAO) # Position attribute gl.vertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, sizeof(Vertex), Vertex.position.offset) gl.enableVertexAttribArray(0) # 4. Unbind the VAO gl.bindVertexArray(0) # 4. unbind the vbo gl.bindBuffer(gl.ARRAY_BUFFER, 0) lightPos = Vec3(1.2, 1.0, 2.0) while not window.shouldClose(): inputMap.begin_frame() glfw.pollEvents() input = inputMap.get_input() camera.processInput(input, 1.0/30.0) framebuffer_width, framebuffer_height = window.getFramebufferSize() gl.viewport(0, 0, framebuffer_width, framebuffer_height) gl.clearColor(0.2, 0.3, 0.3, 1.0) gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT) lightingShaderProgram.use() lightingShaderProgram.uniforms.objectColor = Vec3(1.0, 0.5, 0.31) lightingShaderProgram.uniforms.lightColor = Vec3(1.0, 0.5, 1.0) lightingShaderProgram.uniforms.lightPos = lightPos lightingShaderProgram.uniforms.viewPos = camera.position # create transformations view = camera.getViewMatrix() projection = Mat4.Perspective(45.0, float(WIDTH) / float(HEIGHT), 0.1, 100.0) # assign the transformations lightingShaderProgram.uniforms.view = view lightingShaderProgram.uniforms.projection = projection # draw the container gl.bindVertexArray(containerVAO) model = Mat4.Identity() lightingShaderProgram.uniforms.model = model gl.drawArrays(gl.TRIANGLES, 0, 36) gl.bindVertexArray(0) # draw the lamp lampShaderProgram.use() lampShaderProgram.uniforms.view = view lampShaderProgram.uniforms.projection = projection model = Mat4.Translation(lightPos) * Mat4.Scale(0.2) lampShaderProgram.uniforms.model = model gl.bindVertexArray(lightVAO) gl.drawArrays(gl.TRIANGLES, 0, 36) gl.bindVertexArray(0) window.swapBuffers() lampShaderProgram.delete() lightingShaderProgram.delete() gl.deleteVertexArrays([containerVAO, lightVAO]) gl.deleteBuffers([vbo])
def main(): global lastFrame, planeVAO, planeVBO # Init GLFW glfw.setErrorCallback(error_callback) glfw.init() glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) # glfw.windowHint(glfw.RESIZABLE, gl.FALSE) glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, 1) window = glfw.createWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL") if window is None: print('could not open window.') glfw.terminate() sys.exit() inputMap = InputMap() window.makeContextCurrent() window.setKeyCallback(inputMap.key_callback) window.setCursorPosCallback(inputMap.mouse_callback) #window.setScrollCallback(inputMap.scroll_callback) window.setInputMode(glfw.CURSOR, glfw.CURSOR_DISABLED) # some versions of glfw cause an opengl error when creating a window, make sure that's ignored. gl.init() err = gl.getError() if err: print("WINDOW OPEN ERROR:", err) # Define the viewport dimensions VP_WIDTH, VP_HEIGHT = window.getFramebufferSize() gl.viewport(0, 0, VP_WIDTH, VP_HEIGHT) # Setup some OpenGL options gl.enable(gl.DEPTH_TEST); # Setup and compile our shaders shaderProgram = Shader(SHADOW_MAPPING_VERT, SHADOW_MAPPING_FRAG); simpleDepthShader = Shader(SHADOW_MAPPING_DEPTH_VERT, SHADOW_MAPPING_DEPTH_FRAG); debugDepthQuad = Shader(DEBUG_QUAD_VERT, DEBUG_QUAD_FRAG); # Set texture samples shaderProgram.use(); # shaderProgram.uniforms.diffuseTexture = 0 # shaderProgram.uniforms.shadowMap = 1 # print(dir(Vertex)) planeVertices = (Vertex * 6)( # Positions # Normals # Texture Coords (( 25.0, -0.5, 25.0), (0.0, 1.0, 0.0), (25.0, 0.0)), ((-25.0, -0.5, -25.0), (0.0, 1.0, 0.0), ( 0.0, 25.0)), ((-25.0, -0.5, 25.0), (0.0, 1.0, 0.0), ( 0.0, 0.0)), (( 25.0, -0.5, 25.0), (0.0, 1.0, 0.0), (25.0, 0.0)), (( 25.0, -0.5, -25.0), (0.0, 1.0, 0.0), (25.0, 25.0)), ((-25.0, -0.5, -25.0), (0.0, 1.0, 0.0), ( 0.0, 25.0)) ) # Setup plane VAO planeVAO = gl.genVertexArrays(1)[0] planeVBO = gl.genBuffers(1)[0] gl.bindVertexArray(planeVAO) gl.bindBuffer(gl.ARRAY_BUFFER, planeVBO) gl.bufferData(gl.ARRAY_BUFFER, bytes(planeVertices), gl.STATIC_DRAW) gl.enableVertexAttribArray(0) gl.vertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, sizeof(Vertex), Vertex.position.offset) gl.enableVertexAttribArray(1) gl.vertexAttribPointer(1, 3, gl.FLOAT, gl.FALSE, sizeof(Vertex), Vertex.normal.offset) gl.enableVertexAttribArray(2) gl.vertexAttribPointer(2, 2, gl.FLOAT, gl.FALSE, sizeof(Vertex), Vertex.texcoord.offset) gl.bindVertexArray(0) # Light source lightPos = Vec3(-2.0, 4.0, -1.0) # Load textures woodTexture = load_texture("learningopengl/resources/textures/wood.png") # Configure depth map FBO SHADOW_WIDTH = SHADOW_HEIGHT = 4096 depthMapFBO = gl.genFramebuffers(1)[0] # - Create depth texture depthMap = gl.genTextures(1)[0] gl.bindTexture(gl.TEXTURE_2D, depthMap) gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, gl.DEPTH_COMPONENT, gl.FLOAT, None) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_BORDER) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_BORDER) borderColor = Vec4(1.0, 1.0, 1.0, 1.0) gl.texParameterfv(gl.TEXTURE_2D, gl.TEXTURE_BORDER_COLOR, borderColor) gl.bindFramebuffer(gl.FRAMEBUFFER, depthMapFBO) gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthMap, 0) gl.drawBuffer(gl.NONE) gl.readBuffer(gl.NONE); gl.bindFramebuffer(gl.FRAMEBUFFER, 0); gl.clearColor(0.1, 0.1, 0.1, 1.0) # Game loop while not window.shouldClose(): # Set frame time currentFrame = time.perf_counter() deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; # Check and call events inputMap.begin_frame() glfw.pollEvents() input = inputMap.get_input() camera.processInput(input, 1.0/30.0) # Change light position over time lightPos.z = math.cos(time.perf_counter()) * 2.0 # 1. Render depth of scene to texture (from light's perspective) # - Get light projection/view matrix. near_plane = 1.0 far_plane = 7.5 lightProjection = Mat4.Ortho(-10.0, 10.0, -10.0, 10.0, near_plane, far_plane) # lightProjection = glm::perspective(45.0f, (GLfloat)SHADOW_WIDTH / (GLfloat)SHADOW_HEIGHT, near_plane, far_plane); // Note that if you use a perspective projection matrix you'll have to change the light position as the current light position isn't enough to reflect the whole scene. lightView = Mat4.LookAt(lightPos, Vec3(0.0, 0.0, 0.0), Vec3(1.0, 1.0, 1.0)) lightSpaceMatrix = lightProjection * lightView; # - now render scene from light's point of view simpleDepthShader.use() simpleDepthShader.uniforms.lightSpaceMatrix = lightSpaceMatrix # glUniformMatrix4fv(glGetUniformLocation(simpleDepthShader.Program, "lightSpaceMatrix"), 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix)); gl.viewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT) gl.bindFramebuffer(gl.FRAMEBUFFER, depthMapFBO) gl.clear(gl.DEPTH_BUFFER_BIT); RenderScene(simpleDepthShader); gl.bindFramebuffer(gl.FRAMEBUFFER, 0) # 2. Render scene as normal gl.viewport(0, 0, VP_WIDTH, VP_HEIGHT) gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) shaderProgram.use() # TODO: use zoon projection = Mat4.Perspective(45.0, float(SCR_WIDTH) / float(SCR_HEIGHT), 0.1, 100.0) view = camera.getViewMatrix() shaderProgram.uniforms.projection = projection shaderProgram.uniforms.view = view shaderProgram.uniforms.lightPos = lightPos shaderProgram.uniforms.viewPos = camera.position shaderProgram.uniforms.lightSpaceMatrix = lightSpaceMatrix shaderProgram.uniforms.shadows = 1 shaderProgram.uniforms.diffuseTexture = woodTexture shaderProgram.uniforms.shadowMap = depthMap RenderScene(shaderProgram) # 3. DEBUG: visualize depth map by rendering it to plane debugDepthQuad.use() # these are not actually used. #debugDepthQuad.uniforms.near_plane = near_plane #debugDepthQuad.uniforms.far_plane = far_plane debugDepthQuad.uniforms.depthMap = depthMap # RenderQuad() # uncomment this line to see depth map # Swap the buffers window.swapBuffers() return 0
def main(): draw_mode = 1 global lastFrame, planeVAO, planeVBO # Init GLFW glfw.setErrorCallback(error_callback) glfw.init() glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) # glfw.windowHint(glfw.RESIZABLE, gl.FALSE) glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, 1) window = glfw.createWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL") if window is None: print('could not open window.') glfw.terminate() sys.exit() inputMap = InputMap() window.makeContextCurrent() window.setKeyCallback(inputMap.key_callback) window.setCursorPosCallback(inputMap.mouse_callback) #window.setScrollCallback(inputMap.scroll_callback) window.setInputMode(glfw.CURSOR, glfw.CURSOR_DISABLED) # some versions of glfw cause an opengl error when creating a window, make sure that's ignored. gl.init() err = gl.getError() if err: print("WINDOW OPEN ERROR:", err) # Define the viewport dimensions VP_WIDTH, VP_HEIGHT = window.getFramebufferSize() gl.viewport(0, 0, VP_WIDTH, VP_HEIGHT) # Setup some OpenGL options gl.enable(gl.DEPTH_TEST); #Setup and compile our shaders shaderGeometryPass = Shader(G_BUFFER_VERT, G_BUFFER_FRAG); shaderLightingPass = Shader(DEFERRED_SHADING_VERT, DEFERRED_SHADING_FRAG); shaderLightBox = Shader(DEFERRED_LIGHT_BOX_VERT, DEFERRED_LIGHT_BOX_FRAG); gPosition, gNormal, gAlbedoSpec = gl.genTextures(3) shaderLightingPass.use() shaderLightingPass.uniforms.gPosition = gNormal shaderLightingPass.uniforms.gNormal = gPosition shaderLightingPass.uniforms.gAlbedoSpec = gAlbedoSpec # "learningopengl/resources/objects/cyborg/cyborg.obj" cyborg = Model("learningopengl/resources/objects/cyborg/cyborg.obj") objectPositions = [ Vec3(-3.0, -3.0, -3.0), Vec3( 0.0, -3.0, -3.0), Vec3( 3.0, -3.0, -3.0), Vec3(-3.0, -3.0, 0.0), Vec3( 0.0, -3.0, 0.0), Vec3( 3.0, -3.0, 0.0), Vec3(-3.0, -3.0, 3.0), Vec3( 0.0, -3.0, 3.0), Vec3( 3.0, -3.0, 3.0) ] NR_LIGHTS = 32 lightPositions = (Vec3 * NR_LIGHTS)() lightColors = (Vec3 * NR_LIGHTS)() for i in range(NR_LIGHTS): lightPositions[i].x = random.uniform(-3.0, 3.0) lightPositions[i].y = random.uniform(-4.0, 2.0) lightPositions[i].z = random.uniform(-3.0, 3.0) lightColors[i].x = random.uniform(0.5, 1.0) lightColors[i].y = random.uniform(0.5, 1.0) lightColors[i].z = random.uniform(0.5, 1.0) # set up the G-buffer # 3 textures: p # 1. Positions (RGB) # 2. Color (RGB) + Specular (A) # 3. Normal (RGB) gBuffer = gl.genFramebuffers(1)[0] gl.bindFramebuffer(gl.FRAMEBUFFER, gBuffer) # set up the position buffer gl.bindTexture(gl.TEXTURE_2D, gPosition) gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB16F, VP_WIDTH, VP_HEIGHT, 0, gl.RGB, gl.FLOAT, None) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, gPosition, 0) # set up the normal buffer gl.bindTexture(gl.TEXTURE_2D, gNormal); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, VP_WIDTH, VP_HEIGHT, 0, gl.RGB, gl.FLOAT,None) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, gNormal, 0) # set up the color + specular buffer gl.bindTexture(gl.TEXTURE_2D, gAlbedoSpec); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, VP_WIDTH, VP_HEIGHT, 0, gl.RGBA, gl.FLOAT, None) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT2, gl.TEXTURE_2D, gAlbedoSpec, 0) # - Tell OpenGL which color attachments we'll use (of this framebuffer) for rendering attachments = [gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2] gl.drawBuffers(attachments) # - Create and attach depth buffer (renderbuffer) rboDepth = gl.genRenderbuffers(1)[0] gl.bindRenderbuffer(gl.RENDERBUFFER, rboDepth) gl.renderbufferStorage(gl.RENDERBUFFER,gl.DEPTH_COMPONENT, VP_WIDTH, VP_HEIGHT); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rboDepth) # - Finally check if framebuffer is complete if gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE: print("Framebuffer not complete!") gl.bindFramebuffer(gl.FRAMEBUFFER, 0) gl.clearColor(0.0, 0.0, 0.0, 0.0) # Game loop while not window.shouldClose(): # Set frame time currentFrame = time.perf_counter() deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; # Check and call events inputMap.begin_frame() glfw.pollEvents() input = inputMap.get_input() camera.processInput(input, 1.0/30.0) gl.bindFramebuffer(gl.FRAMEBUFFER, gBuffer) gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) # TODO: use camera.zoom # 1. Geometry Pass: render scene's geometry/color data into gbuffer projection = Mat4.Perspective(45.0, float(SCR_WIDTH)/float(SCR_HEIGHT), 0.1, 100.0) view = camera.getViewMatrix() model = Mat4.Identity() shaderGeometryPass.use() shaderGeometryPass.uniforms.projection = projection shaderGeometryPass.uniforms.view = view for objectPosition in objectPositions: model = Mat4.Translation(objectPosition) * Mat4.Scale(0.25) shaderGeometryPass.uniforms.model = model cyborg.draw(shaderGeometryPass) gl.bindFramebuffer(gl.FRAMEBUFFER, 0) gl.polygonMode(gl.FRONT_AND_BACK, gl.FILL) # 2. Lighting Pass: calculate lighting by iterating over a screen filled quad pixel-by-pixel using the gbuffer's content. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); shaderLightingPass.use() shaderLightingPass.uniforms.gPosition = gPosition shaderLightingPass.uniforms.gNormal = gNormal shaderLightingPass.uniforms.gAlbedoSpec = gAlbedoSpec # Also send light relevant uniforms for i, lightPosition in enumerate(lightPositions): shaderLightingPass.uniforms.lights[i].Position = lightPosition shaderLightingPass.uniforms.lights[i].Color = lightColors[i] # Update attenuation parameters and calculate radius constant = 1.0 linear = shaderLightingPass.uniforms.lights[i].Linear = 0.7 quadratic = shaderLightingPass.uniforms.lights[i].Quadratic = 1.8 # Then calculate radius of light volume/sphere lightThreshold = 5.0 # 5 / 256 maxBrightness = max(max(lightColors[i].r, lightColors[i].g), lightColors[i].b) radius = (-linear + math.sqrt(linear * linear - 4 * quadratic * (constant - (256.0 / lightThreshold) * maxBrightness))) / (2 * quadratic) shaderLightingPass.uniforms.lights[i].Radius = radius shaderLightingPass.uniforms.viewPos = camera.position if window.getKey(glfw.KEY_1): draw_mode = 1 if window.getKey(glfw.KEY_2): draw_mode = 2 if window.getKey(glfw.KEY_3): draw_mode = 3 if window.getKey(glfw.KEY_4): draw_mode = 4 if window.getKey(glfw.KEY_5): draw_mode = 5 # print("SETTING DRAW MODE:", draw_mode) try: shaderLightingPass.uniforms.draw_mode = draw_mode except: pass RenderQuad() # 2.5. Copy content of geometry's depth buffer to default framebuffer's depth buffer gl.bindFramebuffer(gl.READ_FRAMEBUFFER, gBuffer); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, 0); # Write to default framebuffer gl.blitFramebuffer(0, 0, VP_WIDTH, VP_HEIGHT, 0, 0, VP_WIDTH, VP_HEIGHT, gl.DEPTH_BUFFER_BIT, gl.NEAREST); gl.bindFramebuffer(gl.FRAMEBUFFER, 0); # 3. Render lights on top of scene, by blitting shaderLightBox.use() shaderLightBox.uniforms.projection = projection # glUniformMatrix4fv(glGetUniformLocation(shaderLightBox.Program, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); shaderLightBox.uniforms.view = view # glUniformMatrix4fv(glGetUniformLocation(shaderLightBox.Program, "view"), 1, GL_FALSE, glm::value_ptr(view)); for i, lightPosition in enumerate(lightPositions): model = Mat4.Translation(lightPosition) * Mat4.Scale(0.25) shaderLightBox.uniforms.model = model shaderLightBox.uniforms.lightColor = lightColors[i] RenderCube() # Swap the buffers window.swapBuffers() return 0
def main(): glfw.setErrorCallback(error_callback) print("GL:", gl) glfw.init() glfw.windowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.windowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.windowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) glfw.windowHint(glfw.RESIZABLE, gl.FALSE) glfw.windowHint(glfw.OPENGL_FORWARD_COMPAT, 1) window = glfw.createWindow(WIDTH, HEIGHT, "LearnOpenGL") if window is None: print('could not open window.') glfw.terminate() sys.exit() window.makeContextCurrent() # window.setInputMode(glfw.CURSOR, glfw.CURSOR_DISABLED) window.setKeyCallback(key_callback) gl.init() print("IN MODULE:", gl.getError) err = gl.getError() if err: print("WINDOW OPEN ERROR:", err) gl.enable(gl.DEPTH_TEST) gl.enable(gl.BLEND) gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) # set up our application nodebuilder = NodeBuilder() # TODO: this stuff should happen automatically. debugdraw.register_with_nodebuilder(nodebuilder) transformnode.register_with_nodebuilder(nodebuilder) physicsnode.register_with_nodebuilder(nodebuilder) # set up scene = physicsnode.SceneNode(name='physics_scene') # scenenode.SceneNode(name='scene') debugdraw_renderer = debugdraw.RendererNode(name='debugdraw_renderer', parent=scene) sprite_renderer = spritenode.RendererNode(name="sprite_renderer", parent=scene) # space = create_wheelchair_guy(scene) # TODO: finish debugging the get_relative_path method... # print("wheel_suspension -> wheel_body", wheel_suspension.get_relative_path(wheel_body)) # print("wheel_suspension -> body", wheel_suspension.get_relative_path(body)) # print("wheel_suspension -> player", wheel_suspension.get_relative_path(player)) # print("wheel_suspension -> player_body", wheel_suspension.get_relative_path(body)) # # print(wheel_suspension.get_node('../../../..')) # assert(wheel_suspension.get_node('..') is wheel) # p = '../../../..' # print("P", wheel_suspension.get_node(p)) # assert(wheel_suspension.get_node(p) is player) # assert(wheel_suspension.get_node('../wheel_body') is wheel_body) # p = '../../../player_body' # print(wheel_suspension.get_node(p)) # assert(wheel_suspension.get_node(p) is body) while not window.shouldClose(): glfw.pollEvents() framebuffer_width, framebuffer_height = window.getFramebufferSize() gl.viewport(0, 0, framebuffer_width, framebuffer_height) gl.clearColor(0.2, 0.3, 0.3, 1.0) gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT) gl.enable(gl.BLEND) gl.enable(gl.DEPTH_TEST) sprite_renderer.draw() gl.disable(gl.BLEND) gl.disable(gl.DEPTH_TEST) debugdraw_renderer.draw() # draw the debug draw scene on top of the other stuff. scene.step(1.0/30.0, iterations=10) #print(scene.get_node('transform').position, scene.get_node('transform').angle) window.swapBuffers()