Re: How to draw a cube using indices ?

Florian NICOLAS <[email protected]> Fri, 27 Nov 2015 15:20:03 +0000
Newsgroups gmane.comp.python.opengl.user
Message-ID <VI1PR05MB11689BAF193DDF22A193F23EC8030@VI1PR05MB1168.eurprd05.prod.outlook.com>
Yes it works (ctypes.c_void_p(0) also works). =

However, it seems that only half the cube is rendered. It is a bit strange =
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=E8=
me 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 argu=
ment.
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-bretagne=
.org> wrote:
>
>
> Hi everybody!
>
> I recently started to learn OpenGL through Python thanks to several tutor=
ial (especially the Nicolas P. Rougier one: http://www.labri.fr/perso/nroug=
ier/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 see=
ms to be normal as I do not duplicate my vertices and I use the glDrawArray=
s function).
>
> However, after, I build an index "vector" to further use the glDrawElemen=
ts function to render my cube. As a result, I do not get any error but noth=
ing 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_DRAW)
>
> # 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_ST=
ATIC_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