Dec-21-2017, 10:37 PM
I missing something. Just can't get that cube to draw.
Using numpy and modern Opengl. My graphic card support upto 4.6.
Using numpy and modern Opengl. My graphic card support upto 4.6.
import pyglet from pyglet.gl import * from pyglet.graphics.vertexbuffer import create_buffer from random import randrange import numpy as np import ctypes import math # base on gl3n row major def perspective(width, height, fov, near, far): array = np.array([0 for i in range(16)], dtype=float).reshape(4,4) mat = np.matrix(array) aspect = width/height top = near * math.tan(fov * (math.pi/360.0)) bottom = -top right = top * aspect left = -right mat[0,0] = (2 * near) / (right - left) mat[0,2] = (right + left) / (right - left) mat[1,1] = (2 * near) / (top - bottom) mat[1,2] = (top + bottom) / (top - bottom) mat[2,2] = -(far + near) / (far - near) mat[2,3] = -(2 * far + near) / (far - near) mat[3,2] = -1 return mat def normalized(array): if np.linalg.norm(array) != 0: return array / np.linalg.norm(array) return array def matrix_idenity(): return np.matrix(np.identity(4, dtype=float)) def look_at(eye, target, up): look_dir = normalized(target - eye) up_dir = normalized(up) right_dir = normalized(np.cross(look_dir, up_dir)) perp_up_dir = np.cross(right_dir, look_dir) mat = matrix_idenity() mat[0] = np.append(right_dir, [-np.dot(eye, right_dir)]) mat[1] = np.append(perp_up_dir, [-np.dot(eye, perp_up_dir)]) mat[2] = np.append(-look_dir, [np.dot(eye, look_dir)]) return mat class Face: FRONT = 1 # counter clockwise BACK = 2 LEFT = 4 # counter clockwise RIGHT = 8 TOP = 16 # counter clockwise BOTTOM = 32 ALL = 63 def create_cube(size, face=Face.ALL, element=True): array = np.array([ size, size, size, #0 + + + -size, -size, -size, #1 - - - size, -size, -size, #2 + - - size, size, -size, #3 + + - -size, size, -size, #4 - + - -size, size, size, #5 - + + -size, -size, size, #6 - - + size, -size, size #7 + - + ], GLfloat) elements = np.array([], GLuint) if face & Face.BACK: elements = np.append(elements, [1,3,2,3,1,4]) if face & Face.FRONT: elements = np.append(elements, [1,7,0,0,5,6]) if face & Face.LEFT: elements = np.append(elements, [5,4,1,1,6,5]) if face & Face.RIGHT: elements = np.append(elements, [0,2,3,2,0,7]) if face & Face.TOP: elements = np.append(elements, [4,0,3,0,4,5]) if face & Face.BOTTOM: elements = np.append(elements, [1,2,7,7,6,1]) if element: return array, elements pylist = [] for i in elements: n = i * 3 pylist.extend(array[n:n + 3]) return np.array(pylist, GLfloat) class Shader: def __init__(self): self.program = GLuint(glCreateProgram()) vbuffer = open('vshader.glsl', 'r') vshader = glCreateShader(GL_VERTEX_SHADER) vbuff = ctypes.create_string_buffer(vbuffer.read().encode()) vtext = ctypes.cast(ctypes.pointer(ctypes.pointer(vbuff)), ctypes.POINTER(ctypes.POINTER(GLchar))) glShaderSource(vshader, 1, vtext, None) glCompileShader(vshader) success = GLint() infoLog = ctypes.create_string_buffer(512) glGetShaderiv(vshader, GL_COMPILE_STATUS, ctypes.byref(success)) if not success: glGetShaderInfoLog(vshader, 512, None, infoLog) print("Error: Vertex Shader ", infoLog.value) fbuffer = open('fshader.glsl', 'r') fshader = glCreateShader(GL_FRAGMENT_SHADER) fbuff = ctypes.create_string_buffer(fbuffer.read().encode()) ftext = ctypes.cast(ctypes.pointer(ctypes.pointer(fbuff)), ctypes.POINTER(ctypes.POINTER(GLchar))) glShaderSource(fshader, 1, ftext, None) glCompileShader(fshader) glGetShaderiv(fshader, GL_COMPILE_STATUS, ctypes.byref(success)) if not success: glGetShaderInfoLog(fshader, 512, None, infoLog) print("Error: Fragment Shader ", infoLog.value) glAttachShader(self.program, vshader) glAttachShader(self.program, fshader) glLinkProgram(self.program) glGetProgramiv(self.program, GL_LINK_STATUS, ctypes.byref(success)) if not success: glGetShaderInfoLog(fshader, 512, None, infoLog) print("Error: Program ", infoLog.value) # clean up glDeleteShader(vshader) glDeleteShader(fshader) vbuffer.close() fbuffer.close() def uniformMatrix4fv(self, key, count, transpose, value): buff = ctypes.create_string_buffer(key.encode()) location = glGetUniformLocation(self.program, buff) nvalue = np.array(value, GLfloat) # .flatten() nref = nvalue.ctypes.data_as(ctypes.POINTER(ctypes.c_float)) glUniformMatrix4fv(location, count, transpose, nref) def use(self): glUseProgram(self.program) def destroy(self): glDeleteProgram(self.program) class Window(pyglet.window.Window): def __init__(self): pyglet.window.Window.__init__(self) self.context.config.alpha_size = 8 self.context.config.buffer_size = 32 self.context.config.sample_buffers = 1 self.context.config.samples = 4 glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LESS) glClearColor(0.1, 0.0, 0.0, 1.0) glViewport(0, 0, self.width, self.height) print(self.width, self.height) self.model = matrix_idenity() eye = np.array([0,0,4], dtype=float) self.view = look_at(eye, eye + np.array([0,0,4], dtype=float), np.array([0,0,4], dtype=float)) self.projection = perspective(self.width, self.height, 45.0, 1.0, 100.0) self.vertices = create_cube(0.4, element=False) self.vertices[2::3] -= 8 print(self.vertices[:6]) colors = [] for i in range(6): color = [randrange(20, 256), randrange(20, 256), randrange(20, 256)] colors.extend(color + color + color + color + color + color) #self.cube = pyglet.graphics.vertex_list(36, ('v3f', verticies), ('c3B/static', colors)) self.vao = GLuint() glGenVertexArrays(1, self.vao) glBindVertexArray(self.vao) self.vbo = create_buffer(self.vertices.nbytes, GL_ARRAY_BUFFER, GL_STATIC_DRAW) self.vbo.bind() self.vbo.set_data(self.vertices.ctypes.data) #glGenBuffers(1, pointer(self.VBO)) #glBufferData(GL_ARRAY_BUFFER, self.vertices.nbytes, self.vertices, GL_STATIC_DRAW) glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, self.vertices.nbytes, 0); glEnableVertexAttribArray(0); glBindVertexArray(0); self.shader = Shader() def on_draw(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) self.shader.use() self.shader.uniformMatrix4fv('view', 1, GL_TRUE, self.view) self.shader.uniformMatrix4fv('model', 1, GL_TRUE, self.model) self.shader.uniformMatrix4fv('proj', 1, GL_TRUE, self.projection) glBindVertexArray(self.vao); glDrawArrays(GL_TRIANGLES, 0, len(self.vertices)) glBindVertexArray(0) if __name__ == '__main__': window = Window() pyglet.app.run()Shaders
#version 330 core layout (location = 0) in vec3 position; uniform mat4 model; uniform mat4 view; uniform mat4 proj; void main() { gl_Position = proj * view * model * vec4(position, 1.0f); }
#version 330 core void main() { gl_FragColor = vec4(0.0, 0.0, 0.6, 1.0); }
99 percent of computer problems exists between chair and keyboard.