{"id":259,"date":"2009-08-06T20:19:40","date_gmt":"2009-08-06T19:19:40","guid":{"rendered":"http:\/\/www.ozone3d.net\/blogs\/lab\/?p=259"},"modified":"2011-09-07T20:51:02","modified_gmt":"2011-09-07T19:51:02","slug":"pyopengl-pour-coder-en-opengl-dans-geexlab-sans-compilation","status":"publish","type":"post","link":"https:\/\/www.ozone3d.net\/blogs\/lab\/20090806\/pyopengl-pour-coder-en-opengl-dans-geexlab-sans-compilation\/","title":{"rendered":"PyOpenGL pour Coder en OpenGL dans GeeXLab Sans Compilation"},"content":{"rendered":"<p><center><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.ozone3d.net\/blogs\/lab\/public\/200908\/pyopengl-logo.gif\" alt=\"PyOpenGL\"\/><\/p>\n<p><\/center><br \/>\n<!--more--><br \/>\nL\u00e0 j&#8217;avoue je m&#8217;amuse \ud83d\ude00<\/p>\n<p>Ce que j&#8217;adore avec <b>Python<\/b>, c&#8217;est la richesse des librairies tierces. Il y a pratiquement une librairie pour chaque besoin. Le mien \u00e9tait de pouvoir faire des render calls (ou draw call) dans les scripts Python de <b>GeeXLab<\/b>. GeeXLab poss\u00e8de des scripts de type Direct Rendering: il est possible dans ce type de script de faire des rendus d&#8217;objets et plus g\u00e9n\u00e9ralement de contr\u00f4ler le renderer temps r\u00e9el (oui la fameuse carte graphique). Du coup j&#8217;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 \u00eatre le plus complet possible, il faudrait impl\u00e9menter une bonne partie des fonctions OpenGL, ce qui repr\u00e9sente un certain travail.<\/p>\n<p>Je me suis dit, tiens, c&#8217;est peut \u00eatre le moment de tester PyOpenGL&#8230; <a href=\"http:\/\/pyopengl.sourceforge.net\/\">PyOpenGL<\/a> est tout simplement la version Python de l&#8217;API OpenGL. La syntaxe et le nom des fonctions, tout y est!<\/p>\n<p>Alors hop, un petit download (en fait plusieurs car la toute derni\u00e8re 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\u00eat \u00e0 tester <b>PyOpenGL<\/b>. Je me code vite fait (bah oui c&#8217;est GeeXLab&#8230;) une petite demo qui exploite les scripts direct rendering:<\/p>\n<p><center><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.ozone3d.net\/blogs\/lab\/public\/200908\/geexlab-direct-rendering-pyopengl.jpg\" alt=\"PyOpenGL\"\/><\/p>\n<p><\/center><br \/>\nSur l&#8217;image, le fond d\u00e9grad\u00e9 et la grille sont rendus par la logique du moteur 3D, ce qui veut dire aucun render call explicite.<\/p>\n<p>Le carr\u00e9 rouge, les deux sph\u00e8res et les deux lignes au contraire sont dessin\u00e9s par des render calls comme le montre le script ci dessous:<\/p>\n<pre>\r\nimport HYP_Utils\r\nimport HYP_Camera\r\nimport HYP_Renderer\r\nimport HYP_Object\r\nimport HYP_Lighting\r\nimport HYP_Scene\r\n\r\n#--- Lib PyOpenGL\r\n<b>from OpenGL.GL import *<\/b>\r\n\r\n#--- Les matrices de vue et de projection sont \r\n#--- coll\u00e9s \u00e0 la carte graphique.\r\nHYP_Camera.ApplyToRenderer(gMainCameraId)\r\n\r\nsceneWidth, sceneHeight = HYP_Scene.GetWindowSize()\r\n\r\n#--- Yeah! Des petits appels OpenGL. Trop bon!\r\n#--- Ces cinq lignes dessine le carr\u00e9 rouge...\r\n<b>glEnable(GL_SCISSOR_TEST)\r\nglScissor(sceneWidth\/2-100, sceneHeight\/2-100, 200, 200);\r\nglClearColor(1.0, 0.0, 0.0, 1.0)\r\nglClear(GL_COLOR_BUFFER_BIT)\r\nglDisable(GL_SCISSOR_TEST)<\/b>\r\n\r\n#--- Les lignes suivantes dessinent les deux spheres et les \r\n#--- deux lignes\r\nHYP_Lighting.ApplyToRenderer(gLight01Id)\r\n\r\nHYP_Object.ApplyRasterizerStatesToRenderer(gMeshSphere)\r\nHYP_Material.ApplyToRenderer(gSphereMat)\r\n\r\nHYP_Renderer.GPUShaderBind(gPhongShader_GLId)\r\nHYP_Object.SetPosition(gMeshSphere, -20.0, 0.0, 0.0);\r\nHYP_Mesh.RenderSubset(gMeshSphere, 0); \r\nHYP_Renderer.GPUShaderBind(0)\r\n\r\nHYP_Renderer.GPUShaderBind(gNormalShader_GLId)\r\nHYP_Object.SetPosition(gMeshSphere, 20.0, 0.0, 0.0);\r\nHYP_Mesh.RenderSubset(gMeshSphere, 0); \r\nHYP_Renderer.GPUShaderBind(0)\r\n\r\nHYP_Camera.ApplyToRenderer(gMainCameraId)\r\n\r\nHYP_Renderer.SetLightingState(0)\r\nHYP_Renderer.SetLineThickness(2.0)\r\nHYP_Renderer.DrawLine(-20.0, -20.0, 20.0,\r\n\t1.0, 0.0, 0.0, 1.0, \r\n\t20.0, 20.0, -20.0, \r\n\t0.0, 1.0, 0.0, 1.0)\r\nHYP_Renderer.DrawLine(20.0, -20.0, 20.0, \r\n\t0.0, 0.0, 1.0, 1.0, \r\n\t-20.0, 20.0, -20.0, \r\n\t1.0, 1.0, 0.0, 1.0)\r\nHYP_Renderer.SetLineThickness(1.0)\r\n<\/pre>\n<p>Pouvoir coder avec l&#8217;API OpenGL sans compilation est assez d\u00e9lirant! Gr\u00e2ce \u00e0 PyOpenGL, GeeXLab devient une plateforme pour apprendre \u00e0 programmer en OpenGL simplement.<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,374,469],"tags":[348,638,378,641],"class_list":["post-259","post","type-post","status-publish","format-standard","hentry","category-opengl","category-python","category-tools-de-jegx","tag-geexlab","tag-opengl","tag-pyopengl","tag-python"],"aioseo_notices":[],"views":2580,"_links":{"self":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":0,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}