-
-
Save deepankarsharma/3494203 to your computer and use it in GitHub Desktop.
from glfwpy.glfw import (AUTO_POLL_EVENTS, OPENED, OPENGL_CORE_PROFILE, | |
OPENGL_FORWARD_COMPAT, OPENGL_PROFILE, OPENGL_VERSION_MAJOR, | |
OPENGL_VERSION_MINOR, WINDOW, | |
Enable, GetWindowParam, Init, OpenWindow, OpenWindowHint, | |
SetKeyCallback, SetWindowTitle, SwapBuffers, Terminate) | |
import numpy as np | |
from OpenGL.arrays import ArrayDatatype | |
from OpenGL.GL import (GL_ARRAY_BUFFER, GL_COLOR_BUFFER_BIT, | |
GL_COMPILE_STATUS, GL_FALSE, GL_FLOAT, GL_FRAGMENT_SHADER, | |
GL_LINK_STATUS, GL_RENDERER, GL_SHADING_LANGUAGE_VERSION, | |
GL_STATIC_DRAW, GL_TRIANGLES, GL_TRUE, GL_VENDOR, GL_VERSION, | |
GL_VERTEX_SHADER, glAttachShader, glBindBuffer, glBindVertexArray, | |
glBufferData, glClear, glClearColor, glCompileShader, | |
glCreateProgram, glCreateShader, glDeleteProgram, | |
glDeleteShader, glDrawArrays, glEnableVertexAttribArray, | |
glGenBuffers, glGenVertexArrays, glGetAttribLocation, | |
glGetProgramInfoLog, glGetProgramiv, glGetShaderInfoLog, | |
glGetShaderiv, glGetString, glGetUniformLocation, glLinkProgram, | |
glShaderSource, glUseProgram, glVertexAttribPointer) | |
import sys | |
vertex = """ | |
#version 330 | |
in vec3 vin_position; | |
in vec3 vin_color; | |
out vec3 vout_color; | |
void main(void) | |
{ | |
vout_color = vin_color; | |
gl_Position = vec4(vin_position, 1.0); | |
} | |
""" | |
fragment = """ | |
#version 330 | |
in vec3 vout_color; | |
out vec4 fout_color; | |
void main(void) | |
{ | |
fout_color = vec4(vout_color, 1.0); | |
} | |
""" | |
vertex_data = np.array([0.75, 0.75, 0.0, | |
0.75, -0.75, 0.0, | |
-0.75, -0.75, 0.0], dtype=np.float32) | |
color_data = np.array([1, 0, 0, | |
0, 1, 0, | |
0, 0, 1], dtype=np.float32) | |
class ShaderProgram(object): | |
""" Helper class for using GLSL shader programs | |
""" | |
def __init__(self, vertex, fragment): | |
""" | |
Parameters | |
---------- | |
vertex : str | |
String containing shader source code for the vertex | |
shader | |
fragment : str | |
String containing shader source code for the fragment | |
shader | |
""" | |
self.program_id = glCreateProgram() | |
vs_id = self.add_shader(vertex, GL_VERTEX_SHADER) | |
frag_id = self.add_shader(fragment, GL_FRAGMENT_SHADER) | |
glAttachShader(self.program_id, vs_id) | |
glAttachShader(self.program_id, frag_id) | |
glLinkProgram(self.program_id) | |
if glGetProgramiv(self.program_id, GL_LINK_STATUS) != GL_TRUE: | |
info = glGetProgramInfoLog(self.program_id) | |
glDeleteProgram(self.program_id) | |
glDeleteShader(vs_id) | |
glDeleteShader(frag_id) | |
raise RuntimeError('Error linking program: %s' % (info)) | |
glDeleteShader(vs_id) | |
glDeleteShader(frag_id) | |
def add_shader(self, source, shader_type): | |
""" Helper function for compiling a GLSL shader | |
Parameters | |
---------- | |
source : str | |
String containing shader source code | |
shader_type : valid OpenGL shader type | |
Type of shader to compile | |
Returns | |
------- | |
value : int | |
Identifier for shader if compilation is successful | |
""" | |
try: | |
shader_id = glCreateShader(shader_type) | |
glShaderSource(shader_id, source) | |
glCompileShader(shader_id) | |
if glGetShaderiv(shader_id, GL_COMPILE_STATUS) != GL_TRUE: | |
info = glGetShaderInfoLog(shader_id) | |
raise RuntimeError('Shader compilation failed: %s' % (info)) | |
return shader_id | |
except: | |
glDeleteShader(shader_id) | |
raise | |
def uniform_location(self, name): | |
""" Helper function to get location of an OpenGL uniform variable | |
Parameters | |
---------- | |
name : str | |
Name of the variable for which location is to be returned | |
Returns | |
------- | |
value : int | |
Integer describing location | |
""" | |
return glGetUniformLocation(self.program_id, name) | |
def attribute_location(self, name): | |
""" Helper function to get location of an OpenGL attribute variable | |
Parameters | |
---------- | |
name : str | |
Name of the variable for which location is to be returned | |
Returns | |
------- | |
value : int | |
Integer describing location | |
""" | |
return glGetAttribLocation(self.program_id, name) | |
def key_callback(key, action): | |
""" Sample keyboard callback function """ | |
print 'Key: %s Action: %s pressed' % (key, action) | |
if __name__ == "__main__": | |
if not Init(): | |
print 'GLFW initialization failed' | |
sys.exit(-1) | |
# These Window hints are used to specify | |
# which opengl version to use and other details | |
# for the opengl context that will be created | |
OpenWindowHint(OPENGL_VERSION_MAJOR, 3) | |
OpenWindowHint(OPENGL_VERSION_MINOR, 2) | |
OpenWindowHint(OPENGL_PROFILE, OPENGL_CORE_PROFILE) | |
OpenWindowHint(OPENGL_FORWARD_COMPAT, GL_TRUE) | |
if not OpenWindow(1400, 800, 0, 0, 0, 0, 32, 0, WINDOW): | |
print "OpenWindow failed" | |
Terminate() | |
sys.exit(-1) | |
# Every time a key on the keyboard is clicked | |
# call our callback function | |
SetKeyCallback(key_callback) | |
SetWindowTitle("Modern opengl example") | |
Enable(AUTO_POLL_EVENTS) | |
# If everything went well the following calls | |
# will display the version of opengl being used | |
print 'Vendor: %s' % (glGetString(GL_VENDOR)) | |
print 'Opengl version: %s' % (glGetString(GL_VERSION)) | |
print 'GLSL Version: %s' % (glGetString(GL_SHADING_LANGUAGE_VERSION)) | |
print 'Renderer: %s' % (glGetString(GL_RENDERER)) | |
glClearColor(0.95, 1.0, 0.95, 0) | |
# Lets compile our shaders since the use of shaders is now | |
# mandatory. We need at least a vertex and fragment shader | |
# begore we can draw anything | |
program = ShaderProgram(fragment=fragment, vertex=vertex) | |
# Lets create a VAO and bind it | |
# Think of VAO's as object that encapsulate buffer state | |
# Using a VAO enables you to cut down on calls in your draw | |
# loop which generally makes things run faster | |
vao_id = glGenVertexArrays(1) | |
glBindVertexArray(vao_id) | |
# Lets create our Vertex Buffer objects - these are the buffers | |
# that will contain our per vertex data | |
vbo_id = glGenBuffers(2) | |
# Bind a buffer before we can use it | |
glBindBuffer(GL_ARRAY_BUFFER, vbo_id[0]) | |
# Now go ahead and fill this bound buffer with some data | |
glBufferData(GL_ARRAY_BUFFER, ArrayDatatype.arrayByteCount(vertex_data), vertex_data, GL_STATIC_DRAW) | |
# Now specify how the shader program will be receiving this data | |
# In this case the data from this buffer will be available in the shader as the vin_position vertex attribute | |
glVertexAttribPointer(program.attribute_location('vin_position'), 3, GL_FLOAT, GL_FALSE, 0, None) | |
# Turn on this vertex attribute in the shader | |
glEnableVertexAttribArray(0) | |
# Now do the same for the other vertex buffer | |
glBindBuffer(GL_ARRAY_BUFFER, vbo_id[1]) | |
glBufferData(GL_ARRAY_BUFFER, ArrayDatatype.arrayByteCount(color_data), color_data, GL_STATIC_DRAW) | |
glVertexAttribPointer(program.attribute_location('vin_color'), 3, GL_FLOAT, GL_FALSE, 0, None) | |
glEnableVertexAttribArray(1) | |
# Lets unbind our vbo and vao state | |
# We will bind these again in the draw loop | |
glBindBuffer(GL_ARRAY_BUFFER, 0) | |
glBindVertexArray(0) | |
running = True | |
while running: | |
glClear(GL_COLOR_BUFFER_BIT) | |
# Specify shader to be used | |
glUseProgram(program.program_id) | |
# Bind VAO - this will automatically | |
# bind all the vbo's saving us a bunch | |
# of calls | |
glBindVertexArray(vao_id) | |
# Modern GL makes the draw call really simple | |
# All the complexity has been pushed elsewhere | |
glDrawArrays(GL_TRIANGLES, 0, 3) | |
# Lets unbind the shader and vertex array state | |
glUseProgram(0) | |
glBindVertexArray(0) | |
# Now lets show our master piece on the screen | |
SwapBuffers() | |
# If the user has closed the window in anger | |
# then terminate this program | |
running = running and GetWindowParam(OPENED) |
but how did you install glfwpy.glfw??
just wondering... I'm using cyglfw3 at the moment..
I am also unable to find glfwpy. I was able to install pyglfw (a variant) through Anaconda, but it doesn't appear to be working. Could you please tell me where I can get the same package you used?
You can also abuse my OpenGL 3.3+ framework: https://github.com/Contraz/demosys-py
Should be plenty of code you can look at there.
Checkout ModernGL you can do this with less then 100 lines of code.
Thanks! It still helps in 2018 :)
I made my own example on this one with recent glfw calls, you can find it here -> another triangle example , if you want to run it immediatly
I’m new to OpenGL and am very puzzled about the syntax that
Vertex = ‘’’ ....
I don’t understand why the ‘’’ doesn’t starrt ( and end) non-code comments
🤕
fuck yea than you so much, first code that let me run opengl4 with python on mac!!