Re: How to draw a cube using indices ?
"Nicolas P. Rougier" <[email protected]> Fri, 27 Nov 2015 19:19:51 +0100
| Newsgroups | gmane.comp.python.opengl.user |
|---|---|
| Message-ID | <[email protected]> |
Maybe you need to use np.uint32 for the dtype of the index array. Nicolas > On 27 Nov 2015, at 16:20, Florian NICOLAS <florian.nicolas@ensta-bretagne= .org> wrote: > = > Yes it works (ctypes.c_void_p(0) also works). = > However, it seems that only half the cube is rendered. It is a bit strang= e as my vertex and associated indices come from a tutorial. > = > = > = > -------------------------------------------------------------------------= ----------------------------------------------- > NICOLAS Florian > Ing=E9nieur =E9tudes amont - Service Etudes G=E9n=E9rales Sonar > THALES Underwater Systems > ENSTA Bretagne (ex-ENSIETA) - Promotion 2014 - Sp=E9cialit=E9 SPID (Syst= =E8me Perception Information D=E9cision) > Profil PSO (Perception et Syst=E8mes d'Observation) > = > ________________________________________ > De : Nicolas P. Rougier <[email protected]> > Envoy=E9 : vendredi 27 novembre 2015 16:04 > =C0 : Florian NICOLAS > Cc : [email protected] > Objet : Re: [PyOpenGL-Users] How to draw a cube using indices ? > = > You've already bound your index buffer so you don't need to give it as ar= gument. > In your display function: > = > gl.glDrawElements(gl.GL_TRIANGLES, len(index), gl.GL_UNSIGNED_INT, index) > = > becomes > = > gl.glDrawElements(gl.GL_TRIANGLES, len(index), gl.GL_UNSIGNED_INT, None) > = > = > = > Nicolas > = > = >> On 27 Nov 2015, at 14:57, Florian NICOLAS <florian.nicolas@ensta-bretagn= e.org> wrote: >> = >> = >> Hi everybody! >> = >> I recently started to learn OpenGL through Python thanks to several tuto= rial (especially the Nicolas P. Rougier one: http://www.labri.fr/perso/nrou= gier/teaching/opengl/). >> = >> I am now switching to 3D and I am trying to draw a cube. >> = >> Thus, I manage to get some triangles which do not render a cube (this se= ems to be normal as I do not duplicate my vertices and I use the glDrawArra= ys function). >> = >> However, after, I build an index "vector" to further use the glDrawEleme= nts function to render my cube. As a result, I do not get any error but not= hing appears on screen. >> = >> I hope you could be of some help! >> = >> Thanks. >> = >> Here is my code: >> = >> #! /usr/bin/env python >> # -*- coding: utf-8 -*- >> = >> import sys >> import ctypes >> import numpy as np >> import OpenGL.GL as gl >> import OpenGL.GLUT as glut >> = >> vertex_code =3D """ >> = >> uniform float scale; >> uniform mat4 matCam; >> attribute vec4 color; >> attribute vec3 position; >> varying vec4 v_color; >> void main() >> { >> gl_Position =3D matCam*vec4(scale*position, 1.0); >> v_color =3D color; >> } """ >> = >> fragment_code =3D """ >> varying vec4 v_color; >> void main() >> { >> gl_FragColor =3D v_color; >> } """ >> = >> def display(): >> gl.glClear(gl.GL_COLOR_BUFFER_BIT) >> #gl.glDrawArrays(gl.GL_TRIANGLES, 0, 12) >> gl.glDrawElements(gl.GL_TRIANGLES, len(index), gl.GL_UNSIGNED_INT, in= dex) # render nothing (i.e. only the background color) >> glut.glutSwapBuffers() >> = >> def reshape(width,height): >> gl.glViewport(0, 0, width, height) >> = >> def keyboard( key, x, y ): >> if key =3D=3D '\033': >> sys.exit( ) >> = >> def timer(fps): >> global clock >> clock +=3D 0.0005*1000.0/fps >> print(clock) >> # eye =3D np.array([0,0,1]) >> # center =3D np.array([0,clock,0]) >> # up =3D np.array([0,1,0]) >> # mat =3D computeLookAtMatrix(eye, center, up) >> theta =3D clock; >> mat =3D np.array([[np.cos(theta), 0, np.sin(theta), 0], >> [0, 1, 0, 0], >> [-np.sin(theta), 0, np.cos(theta), 0], >> [0, 0, 0, 1]]) >> loc =3D gl.glGetUniformLocation(program, "matCam") >> gl.glUniformMatrix4fv(loc, 1, False, mat) >> = >> = >> = >> glut.glutTimerFunc(1000/fps, timer, fps) >> glut.glutPostRedisplay() >> = >> = >> # GLUT init >> # -------------------------------------- >> glut.glutInit() >> glut.glutInitDisplayMode(glut.GLUT_DOUBLE | glut.GLUT_RGBA) >> glut.glutCreateWindow('Hello world!') >> glut.glutReshapeWindow(512,512) >> glut.glutReshapeFunc(reshape) >> glut.glutDisplayFunc(display) >> glut.glutKeyboardFunc(keyboard) >> glut.glutTimerFunc(1000/60, timer, 60) >> = >> # Build data >> # -------------------------------------- >> data =3D np.zeros(8, [("position", np.float32, 3), >> ("color", np.float32, 4)]) >> = >> data['color'] =3D [ (1,0,0,1), (0,1,0,1), (0,0,1,1), (1,1,0,1), >> (1,0,0,1), (0,1,0,1), (0,0,1,1), (1,1,0,1) ] >> = >> data['position'] =3D [ (-1,-1,1), >> (1,-1,1), >> (1,1,1), >> (-1,1,1), >> (-1,-1,-1), >> (1,-1,-1), >> (1,1,-1), >> (-1,1,-1)] >> = >> index =3D np.array([0,1,2, >> 2,3,0, >> 1,5,6, >> 6,2,1, >> 7,6,5, >> 5,4,7, >> 4,0,3, >> 3,7,4, >> 4,5,1, >> 1,0,4, >> 3,2,6, >> 6,7,3]) >> = >> # Build & activate program >> # -------------------------------------- >> = >> # Request a program and shader slots from GPU >> program =3D gl.glCreateProgram() >> vertex =3D gl.glCreateShader(gl.GL_VERTEX_SHADER) >> fragment =3D gl.glCreateShader(gl.GL_FRAGMENT_SHADER) >> = >> # Set shaders source >> gl.glShaderSource(vertex, vertex_code) >> gl.glShaderSource(fragment, fragment_code) >> = >> # Compile shaders >> gl.glCompileShader(vertex) >> gl.glCompileShader(fragment) >> = >> # Attach shader objects to the program >> gl.glAttachShader(program, vertex) >> gl.glAttachShader(program, fragment) >> = >> # Build program >> gl.glLinkProgram(program) >> = >> # Get rid of shaders (no more needed) >> gl.glDetachShader(program, vertex) >> gl.glDetachShader(program, fragment) >> = >> # Make program the default program >> gl.glUseProgram(program) >> = >> = >> # Build buffer >> # -------------------------------------- >> = >> # Request a buffer slot from GPU >> buffer =3D gl.glGenBuffers(1) >> = >> # Make this buffer the default one >> gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buffer) >> = >> # Upload data >> gl.glBufferData(gl.GL_ARRAY_BUFFER, data.nbytes, data, gl.GL_DYNAMIC_DRA= W) >> = >> # same for index buffer >> buffer_index=3D gl.glGenBuffers(1) >> gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, buffer_index) >> gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, index.nbytes, index, gl.GL_S= TATIC_DRAW) >> = >> = >> # Bind attributes >> # -------------------------------------- >> stride =3D data.strides[0] >> offset =3D ctypes.c_void_p(0) >> loc =3D gl.glGetAttribLocation(program, "position") >> gl.glEnableVertexAttribArray(loc) >> gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buffer) >> gl.glVertexAttribPointer(loc, 3, gl.GL_FLOAT, False, stride, offset) >> = >> offset =3D ctypes.c_void_p(data.dtype["position"].itemsize) >> loc =3D gl.glGetAttribLocation(program, "color") >> gl.glEnableVertexAttribArray(loc) >> gl.glBindBuffer(gl.GL_ARRAY_BUFFER, buffer) >> gl.glVertexAttribPointer(loc, 4, gl.GL_FLOAT, False, stride, offset) >> = >> gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, buffer_index) >> = >> # Bind uniforms >> # -------------------------------------- >> loc =3D gl.glGetUniformLocation(program, "scale") >> gl.glUniform1f(loc, 0.5) >> clock =3D 0 >> = >> loc =3D gl.glGetUniformLocation(program, "matCam") >> print(loc) >> gl.glUniformMatrix4fv(loc, 1, False, np.eye(4)) >> = >> # Enter mainloop >> # -------------------------------------- >> glut.glutMainLoop() >> ------------------------------------------------------------------------= ------ >> _______________________________________________ >> PyOpenGL Homepage >> http://pyopengl.sourceforge.net >> _______________________________________________ >> PyOpenGL-Users mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/pyopengl-users > = > = > -------------------------------------------------------------------------= ----- > _______________________________________________ > PyOpenGL Homepage > http://pyopengl.sourceforge.net > _______________________________________________ > PyOpenGL-Users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/pyopengl-users ---------------------------------------------------------------------------= --- _______________________________________________ PyOpenGL Homepage http://pyopengl.sourceforge.net