PyOpenGL pour Coder en OpenGL dans GeeXLab Sans Compilation

PyOpenGL



Là j’avoue je m’amuse :D

Ce que j’adore avec Python, c’est la richesse des librairies tierces. Il y a pratiquement une librairie pour chaque besoin. Le mien était de pouvoir faire des render calls (ou draw call) dans les scripts Python de GeeXLab. GeeXLab possède des scripts de type Direct Rendering: il est possible dans ce type de script de faire des rendus d’objets et plus généralement de contrôler le renderer temps réel (oui la fameuse carte graphique). Du coup j’ai coder une librairie LUA/Python au doux nom de HYP_Renderer. Cette lib a les fonctions de base pour dialoguer avec la carte graphique via OpenGL. Mais pour être le plus complet possible, il faudrait implémenter une bonne partie des fonctions OpenGL, ce qui représente un certain travail.

Je me suis dit, tiens, c’est peut être le moment de tester PyOpenGL… PyOpenGL est tout simplement la version Python de l’API OpenGL. La syntaxe et le nom des fonctions, tout y est!

Alors hop, un petit download (en fait plusieurs car la toute dernière version de la lib, PyOpenGL-3.0.1a2.win32.exe, semble avoir quelques bugs, je me suis donc rabattu sur le fichier PyOpenGL-3.0.0c1.win32.exe), une petite install, et me voici prêt à tester PyOpenGL. Je me code vite fait (bah oui c’est GeeXLab…) une petite demo qui exploite les scripts direct rendering:

PyOpenGL


Sur l’image, le fond dégradé et la grille sont rendus par la logique du moteur 3D, ce qui veut dire aucun render call explicite.

Le carré rouge, les deux sphères et les deux lignes au contraire sont dessinés par des render calls comme le montre le script ci dessous:

import HYP_Utils
import HYP_Camera
import HYP_Renderer
import HYP_Object
import HYP_Lighting
import HYP_Scene

#--- Lib PyOpenGL
from OpenGL.GL import *

#--- Les matrices de vue et de projection sont 
#--- collés à la carte graphique.
HYP_Camera.ApplyToRenderer(gMainCameraId)

sceneWidth, sceneHeight = HYP_Scene.GetWindowSize()

#--- Yeah! Des petits appels OpenGL. Trop bon!
#--- Ces cinq lignes dessine le carré rouge...
glEnable(GL_SCISSOR_TEST)
glScissor(sceneWidth/2-100, sceneHeight/2-100, 200, 200);
glClearColor(1.0, 0.0, 0.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
glDisable(GL_SCISSOR_TEST)

#--- Les lignes suivantes dessinent les deux spheres et les 
#--- deux lignes
HYP_Lighting.ApplyToRenderer(gLight01Id)

HYP_Object.ApplyRasterizerStatesToRenderer(gMeshSphere)
HYP_Material.ApplyToRenderer(gSphereMat)

HYP_Renderer.GPUShaderBind(gPhongShader_GLId)
HYP_Object.SetPosition(gMeshSphere, -20.0, 0.0, 0.0);
HYP_Mesh.RenderSubset(gMeshSphere, 0); 
HYP_Renderer.GPUShaderBind(0)

HYP_Renderer.GPUShaderBind(gNormalShader_GLId)
HYP_Object.SetPosition(gMeshSphere, 20.0, 0.0, 0.0);
HYP_Mesh.RenderSubset(gMeshSphere, 0); 
HYP_Renderer.GPUShaderBind(0)

HYP_Camera.ApplyToRenderer(gMainCameraId)

HYP_Renderer.SetLightingState(0)
HYP_Renderer.SetLineThickness(2.0)
HYP_Renderer.DrawLine(-20.0, -20.0, 20.0,
	1.0, 0.0, 0.0, 1.0, 
	20.0, 20.0, -20.0, 
	0.0, 1.0, 0.0, 1.0)
HYP_Renderer.DrawLine(20.0, -20.0, 20.0, 
	0.0, 0.0, 1.0, 1.0, 
	-20.0, 20.0, -20.0, 
	1.0, 1.0, 0.0, 1.0)
HYP_Renderer.SetLineThickness(1.0)

Pouvoir coder avec l’API OpenGL sans compilation est assez délirant! Grâce à PyOpenGL, GeeXLab devient une plateforme pour apprendre à programmer en OpenGL simplement.

  • Pingback: PyOpenGL: OpenGL Programming Without Compilation! | The Geeks Of 3D - 3D Tech News

  • kuranes

    Ou peut-on trouver les features de pyOpengl, ca supporte les shaders ? quelles version de glsl ? sur quoi ca se base pour le multiplatforme (ie: on peut utiliser plusieurs ecrans) ?

  • http://www.ozone3d.net JeGX

    Oui PyOpenGL supporte les shaders. PyOPenGL supporte toutes les fonctionnalités d’OpenGL (ou presque cat j’ai pas verifié dans le detail). Les mises à jour ont l’air assez régulières (la dernière date du 14 aout 2009).

    Le multiplateforme n’a rien à voir avec le multi-ecran…