class HelloTriangle(OpenGLApp): def __init__(self): super().__init__("Hello Triangle") self._vao = 0 self._shader_program = None def initialize(self): vertices = np.array([-0.5, -0.5, 0.0, 0.5, -0.5, 0.0, 0.0, 0.5, 0.0], dtype=np.float32) self._vao = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 3 * ctypes.sizeof(ctypes.c_float), None) GL.glEnableVertexAttribArray(0) GL.glBindVertexArray(0) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/hello_triangle_vertex.glsl") fragment_shader = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/hello_triangle_frag.glsl") self._shader_program = ShaderProgram(vertex_shader, fragment_shader) vertex_shader.delete() fragment_shader.delete() def render(self): self._shader_program.use() GL.glBindVertexArray(self._vao) GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)
class MultiTexturesApp(OpenGLApp): def __init__(self): super().__init__("Textures") self._vao = 0 self._texture1 = None self._texture2 = None self._shader_program = None def initialize(self): vertices = np.array([ 0.5, 0.5, 0.0, 1.0, 1.0, # top right 0.5, -0.5, 0.0, 1.0, 0.0, # bottom right -0.5, -0.5, 0.0, 0.0, 0.0, # bottom left -0.5, 0.5, 0.0, 0.0, 1.0 # top left ], dtype=np.float32) indices = np.array([0, 1, 3, 1, 2, 3], dtype=np.uint32) self._vao = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW) float_size = ctypes.sizeof(ctypes.c_float) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 5 * float_size, ctypes.c_void_p(0)) GL.glEnableVertexAttribArray(0) GL.glVertexAttribPointer(1, 2, GL.GL_FLOAT, GL.GL_FALSE, 5 * float_size, ctypes.c_void_p(3 * float_size)) GL.glEnableVertexAttribArray(1) ebo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, ebo) GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices, GL.GL_STATIC_DRAW) GL.glBindVertexArray(0) self._texture1 = Texture2D("img.png", unit=0) self._texture2 = Texture2D("awesomeface.png", flip_y=True, unit=1) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/textures_multi_vertex.glsl") fragment_shader = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/textures_multi_frag.glsl") self._shader_program = ShaderProgram(vertex_shader, fragment_shader) vertex_shader.delete() fragment_shader.delete() def render(self): self._texture1.use() self._texture2.use() GL.glBindVertexArray(self._vao) self._shader_program.use() self._shader_program.set_int("texture1", 0) self._shader_program.set_int("texture2", 1) GL.glDrawElements(GL.GL_TRIANGLES, 6, GL.GL_UNSIGNED_INT, None) GL.glBindVertexArray(0)
class HelloTriangleImgui(OpenGLApp): def __init__(self): super().__init__("Hello Triangle with ImGui") self._vao = 0 self._shader_program = None self._ui = None def initialize(self): vertices = np.array([-0.5, -0.5, 0.0, 0.5, -0.5, 0.0, 0.0, 0.5, 0.0], dtype=np.float32) self._vao = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 3 * ctypes.sizeof(ctypes.c_float), None) GL.glEnableVertexAttribArray(0) GL.glBindVertexArray(0) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/hello_triangle_vertex.glsl") fragment_shader = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/hello_triangle_frag.glsl") self._shader_program = ShaderProgram(vertex_shader, fragment_shader) vertex_shader.delete() fragment_shader.delete() imgui.create_context() self._ui = GlfwRenderer(self._window, False) def render(self): self._shader_program.use() GL.glBindVertexArray(self._vao) GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3) def render_ui(self): imgui.new_frame() imgui.show_demo_window() imgui.render() self._ui.render(imgui.get_draw_data()) self._ui.process_inputs()
class ShadersApp(OpenGLApp): def __init__(self): super().__init__("Shaders Uniform") self._vao = 0 self._shader_program = None def initialize(self): vertices = np.array([-0.5, -0.5, 0.0, 0.5, -0.5, 0.0, 0.0, 0.5, 0.0], dtype=np.float32) self._vao = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 3 * ctypes.sizeof(ctypes.c_float), None) GL.glEnableVertexAttribArray(0) GL.glBindVertexArray(0) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/hello_triangle_vertex.glsl") fragment_shader = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/shaders_uniform_frag.glsl") self._shader_program = ShaderProgram(vertex_shader, fragment_shader) vertex_shader.delete() fragment_shader.delete() def render(self): self._shader_program.use() # Update the uniform color time_value = glfw.get_time() green_value = math.sin(time_value) / 2.0 + 0.5 self._shader_program.set_float4("ourColor", 0.0, green_value, 0.0, 0.0) GL.glBindVertexArray(self._vao) GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)
class ShadersEx1(OpenGLApp): def __init__(self): super().__init__("Shaders Exercise 1") self._vao = 0 self._shader_program = None def initialize(self): vertices = np.array([ # position # color 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, -0.5, 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 1.0], dtype=np.float32) self._vao = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW) # position vertex attribute GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 6 * ctypes.sizeof(ctypes.c_float), c_void_p(0)) GL.glEnableVertexAttribArray(0) # color vertex attribute GL.glVertexAttribPointer(1, 3, GL.GL_FLOAT, GL.GL_FALSE, 6 * ctypes.sizeof(ctypes.c_float), c_void_p(3 * ctypes.sizeof(ctypes.c_float))) GL.glEnableVertexAttribArray(1) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/shaders_ex1_vertex.glsl") fragment_shader = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/shaders_ex1_frag.glsl") self._shader_program = ShaderProgram(vertex_shader, fragment_shader) def render(self): self._shader_program.use() GL.glBindVertexArray(self._vao) GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)
class HelloTriangleEx3(OpenGLApp): def __init__(self): super().__init__("Hello Triangle Exercise 2") self._vao_a = 0 self._vao_b = 0 self._shader_program_orange = None self._shader_program_pink = None def initialize(self): vertices_a = np.array([ -0.6, -0.5, 0.0, 0.4, -0.5, 0.0, -0.1, 0.5, 0.0], dtype=np.float32) vertices_b = np.array([ 0.1, 0.5, 0.0, 0.6, -0.5, 0.0, 1.0, 0.5, 0.0 ], dtype=np.float32) self._vao_a = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao_a) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices_a, GL.GL_STATIC_DRAW) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 3 * ctypes.sizeof(ctypes.c_float), None) GL.glEnableVertexAttribArray(0) GL.glBindVertexArray(0) self._vao_b = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao_b) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices_b, GL.GL_STATIC_DRAW) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 3 * ctypes.sizeof(ctypes.c_float), None) GL.glEnableVertexAttribArray(0) GL.glBindVertexArray(0) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/hello_triangle_vertex.glsl") fragment_shader_orange = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/hello_triangle_ex3_frag.glsl.template", color="1.0, 0.6, 0.2, 1.0") fragment_shader_pink = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/hello_triangle_ex3_frag.glsl.template", color="1.0, 0.75, 0.8, 1.0") self._shader_program_orange = ShaderProgram(vertex_shader, fragment_shader_orange) self._shader_program_pink = ShaderProgram(vertex_shader, fragment_shader_pink) vertex_shader.delete() fragment_shader_orange.delete() fragment_shader_pink.delete() def render(self): self._shader_program_orange.use() GL.glBindVertexArray(self._vao_a) GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3) self._shader_program_pink.use() GL.glBindVertexArray(self._vao_b) GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)
class TexturesApp(OpenGLApp): def __init__(self): super().__init__("Textures Exercise 3") self._vao = 0 self._texture = None self._shader_program = None def initialize(self): vertices = np.array( [ 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 0.55, 0.55, # top right 0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 0.55, 0.45, # bottom right -0.5, -0.5, 0.0, 0.0, 0.0, 1.0, 0.45, 0.45, # bottom left -0.5, 0.5, 0.0, 1.0, 1.0, 0.0, 0.45, 0.55 # top left ], dtype=np.float32) indices = np.array([0, 1, 3, 1, 2, 3], dtype=np.uint32) self._vao = GL.glGenVertexArrays(1) GL.glBindVertexArray(self._vao) vbo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo) GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW) float_size = ctypes.sizeof(ctypes.c_float) GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 8 * float_size, ctypes.c_void_p(0)) GL.glEnableVertexAttribArray(0) GL.glVertexAttribPointer(1, 3, GL.GL_FLOAT, GL.GL_FALSE, 8 * float_size, ctypes.c_void_p(3 * float_size)) GL.glEnableVertexAttribArray(1) GL.glVertexAttribPointer(2, 2, GL.GL_FLOAT, GL.GL_FALSE, 8 * float_size, ctypes.c_void_p(6 * float_size)) GL.glEnableVertexAttribArray(2) ebo = GL.glGenBuffers(1) GL.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, ebo) GL.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices, GL.GL_STATIC_DRAW) GL.glBindVertexArray(0) self._texture = Texture2D("awesomeface.png", flip_y=True, wrap_s=GL.GL_REPEAT, wrap_t=GL.GL_REPEAT, min_filter=GL.GL_NEAREST, mag_filter=GL.GL_NEAREST) vertex_shader = Shader(GL.GL_VERTEX_SHADER, "shaders_src/textures_vertex.glsl") fragment_shader = Shader(GL.GL_FRAGMENT_SHADER, "shaders_src/textures_frag.glsl") self._shader_program = ShaderProgram(vertex_shader, fragment_shader) vertex_shader.delete() fragment_shader.delete() def render(self): self._texture.use() GL.glBindVertexArray(self._vao) self._shader_program.use() GL.glDrawElements(GL.GL_TRIANGLES, 6, GL.GL_UNSIGNED_INT, None) GL.glBindVertexArray(0)